質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2189閲覧

Python3 UnboundLocalErrorについて

0zer0

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/02 13:05

編集2019/07/02 14:22

前提・実現したいこと

名刺からテキストを抽出するプログラムを作成中に以下のエラーメッセージが発生

発生している問題・エラーメッセージ

UnboundLocalError: local variable 'text' referenced before assignment

該当のソースコード

Python3

1import base64 2import requests 3import json 4 5def ocr(image_file, access_token=None): 6 with open(image_file, 'rb') as image: 7 base64_image = base64.b64encode(image.read()).decode() 8 # base64_image = image.read() 9 10 url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(access_token) 11 header = {'Content-Type': 'application/json'} 12 body = { 13 'requests': [{ 14 'image': { 15 'content': base64_image, 16 }, 17 'features': [{ 18 'type': 'TEXT_DETECION', 19 'maxResults': 1, 20 }] 21 22 }] 23 } 24 response = requests.post(url, headers=header, json=body).json() 25 # jsonで吐き出し response 26 # fw = open('vision_response.json','w') 27 # json.dump(response.fw.indent=4) 28 29 # print("responseの値は?" + str(response)) 30 try: 31 text = response['responses'][0]['textAnnotations'][0]['description'] if len(response['responses'][0]) > 0 else '' 32 except KeyError: 33 pass 34 print("textの値は?" + str(text)) 35 return text 36 37# imgの画像ファイルのあるPATHは環境に合わせて変更する 38img = "/content/testtest2.jpg" 39key = "AIzaSyB1pHeQQwxjs8AE7T615wcvpRJbzmg0np4" 40data = ocr(img, key) 41print(data) 42

試したこと

indentの調整

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/07/02 14:17

ソースコード欄に、間違えてエラーメッセージをコピペしていますよ。 ソースコード欄には、ソースコードをコピペしましょう。
0zer0

2019/07/02 14:22

ご指摘ありがとうございます。 先ほど更新しました。
guest

回答3

0

tryの次のtext = ~~~の行で、KeyErrorが発生しているのでしょう。この場合、textへの代入がされてないままで、printしようとします。

投稿2019/07/02 14:30

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0zer0

2019/07/02 15:05

回答ありがとうございます。 まだまだ勉強でして、もう少し具体的にご教授頂けると嬉しいです。
otn

2019/07/02 15:09

どの辺が分かりませんか? そもそも、tryは何のために書いたのですか?
0zer0

2019/07/03 02:38

回答ありがとうございます。 tryを書いた経緯としましては tryの中の辞書[responses]がKeyErrorと出ましたのでその例外処理として記述した次第です。
otn

2019/07/03 06:50

KeyErrorのとき、どうしたいのですが?例外のとき、textに何を代入するのですか? 何も代入していないので、エラーになってます。
guest

0

ベストアンサー

コードが一部しかありませんが、きっと例外処理かなにかで分岐するとtextになにも代入されないようになっているのでしょう。

分岐の両方でtextに代入を行うか、分岐したときはprint("textの値は?" + str(text))の行が実行されないようにする、といった対処が必要になります。

投稿2019/07/02 13:23

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0zer0

2019/07/02 13:27

回答ありがとうございます。 ソースコードが上手く貼れていなかった為後ほど更新します。
hayataka2049

2019/07/02 14:37

想像通りでした。 except KeyError: の中で、passの代わりに空の文字列をtextに代入してはいかがでしょうか。
0zer0

2019/07/03 02:48

回答ありがとうございます。 ご指摘の通り passをtext = ' 'へ書き換えてみました所 FileNotFoundErrorが発生しました。 パスはあっているとは思うのですが...
0zer0

2019/07/03 02:52

エラー文記載します。 --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-1-a8fdf0de5c18> in <module>() 38 img = "/content/testtest2.jpg" 39 key = "AIzaSyB1pHeQQwxjs8AE7T615wcvpRJbzmg0np4" ---> 40 data = ocr(img, key) 41 print(data) 42 <ipython-input-1-a8fdf0de5c18> in ocr(image_file, access_token) 4 5 def ocr(image_file, access_token=None): ----> 6 with open(image_file, 'rb') as image: 7 base64_image = base64.b64encode(image.read()).decode() 8 # base64_image = image.read() FileNotFoundError: [Errno 2] No such file or directory: '/content/testtest2.jpg'
0zer0

2019/07/03 03:02

追記です。 FileNotFoundErrorは指定パス内にファイルが消えていた為、再度アップロードすると実行出来ました。 しかし今度はoutputが「textの値は?」とだけ出て画像の情報が出てきません。 因みにGoogle Colaboratory上で動かしています。
hayataka2049

2019/07/03 03:48

KeyErrorのときは「画像の情報が(何らかの理由で)取得できなかった」ということなので、「textの値は?」とだけ出てくる挙動で正常だと思います。 そういう状況下での挙動をカスタマイズしたければ、コードを適切に書き換える必要があります。
0zer0

2019/07/03 05:29

正常の挙動なのですね。 コードの書き換え方がさっぱりわかりません。 僅かでも構わないので、ご教示いただけないでしょうか。
hayataka2049

2019/07/03 05:34

どんな挙動にしたいのかまったくわからないので、ろくなヒントも出せませんが……私が書くなら、「取得できない」ときはexceptでtextに値を代入する代わりにNoneをreturnして、受け取り側でNoneかどうか判定して成功か失敗か調べるとか。それか、自作の例外を定義してraiseするという手もあります(受け取り側で例外処理する前提のもとで。その方がスマートかもしれません)。
0zer0

2019/07/03 05:47

回答ありがとうございます。 理想の挙動としましては textの値は? 企業ロゴ 氏名 Tel Mail Service サービス名 企業名 住所 のように抽出したいと思っています。
0zer0

2019/07/03 05:49

NoneをReturnさせてみた所、outputは以下のように出ています。 responseの値は?{'error': {'code': 400, 'message': 'Invalid value at \'requests[0].features[0].type\' (TYPE_ENUM), "TEXT_DETECION"', 'status': 'INVALID_ARGUMENT', 'details': [{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'requests[0].features[0].type', 'description': 'Invalid value at \'requests[0].features[0].type\' (TYPE_ENUM), "TEXT_DETECION"'}]}]}} textの値は?None None
hayataka2049

2019/07/03 06:05

TEXT_DETECIONのスペルミスで取得に失敗してるのでは
0zer0

2019/07/03 06:14

ご指摘ありがとうございます。 本当ですね... "TEXT_DETECION"ではなく正しくは "TEXT_DETECTION"でした。 理想通りの挙動を確認する事が出来ました。 半分以上諦めていたので感謝しきれません。 お礼の内に入るかどうかわかりませんがベストアンサーとさせていただきます。 ありがとうございました。
guest

0

Google翻訳
UnboundLocalError: 代入前に参照されるローカル変数 'text'

投稿2019/07/02 13:10

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問