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

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

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

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

Q&A

解決済

2回答

658閲覧

Python3のエラー「変数が定義されていません」が出てくる理由を教えてほしい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2019/06/08 05:57

前提・実現したいこと

プログラミング初心者です。以下のサイトのexcelをopenpyxlを使ってjson形式に改変するプログラムを作っています。
http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html#kotei-denwa- リスト
しかし、この9つのファイルの中の「5,8から始まる市外局番」のexcelだけはこのプログラムで改変しようとするとエラーが発生してしまいます。
現在はエラーの通りに変数を定義(#Converting内の while文の前に「data_j = str("")」を追加)することでエラーを解消できたのですが、なぜこれらの2つのファイルだけエラーが出てくるのかが未だに分かりません。教えていただけませんでしょうか。

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

Traceback (most recent call last): File "D:/ndis-scraping/convert.py", line 64, in <module> data_j_all = data_j_all + str(data_j) NameError: name 'data_j' is not defined

該当のソースコード

Python3

1import pathlib as pl 2import openpyxl as px 3import json as js 4 5# Initial Setting 6path = pl.Path(__file__).resolve().parent 7 8# Preparing "xlsx" 9message_1 = "○ Please enter a file name of the \"xlsx\" fomat." + " (Path: " + str(path) + '/excel/' + ")" 10print(message_1) 11xl_name = input() 12xl_path = str(path) + '/excel/' + xl_name + '.xlsx' 13 14 15# Checking "xlsx" 16xl_check = pl.Path(xl_path).exists() 17while False == xl_check: 18 print(message_1) 19 xl_name = input() 20 xl_path = str(path) + '/excel/' + xl_name + '.xlsx' 21 xl_check = pl.Path(xl_path).exists() 22 23# Opening "xlsx" 24xl_wb = px.load_workbook(xl_path) 25xl_ws = xl_wb.sheetnames 26message_2 = "○ Please select a worksheet. (With numbers from left to right) ... " + str(xl_ws) 27print(message_2) 28xl_sn_in = int(input()) 29 30# Checking "xl_sn_in" 31xl_sn_max = int(len(xl_ws)) 32while xl_sn_max < xl_sn_in or xl_sn_in < 1: 33 print(message_2) 34 xl_sn_in = int(input()) 35 xl_sn_max = int(len(xl_ws)) 36 37# Selecting 38xl_sn = xl_sn_in - 1 39xl_st = xl_ws[xl_sn] 40xl_sld = xl_wb[xl_st] 41 42# Converting (Changeavle) 43print("Now converting...") 44start = 3 45data_j_all = "[\n" 46while 6000 >= start: 47 data_G = xl_sld["G" + str(start)].value 48 data_G2 = xl_sld["G" + str(start + 1)].value 49 if None == data_G: 50 break 51 if "使用不可" == data_G or "使用予定" == data_G or "使用中" == data_G: 52 data_B = xl_sld["B" + str(start)].value 53 data_C = xl_sld["C" + str(start)].value 54 data_D = xl_sld["D" + str(start)].value 55 data_E = xl_sld["E" + str(start)].value 56 data_j_l = "\"Location\": \"" + data_B + "\"" 57 data_j_tna = "\"TNall\": \"" + data_C + "\"" 58 data_j_tno = "\"TNout\": \"" + data_D + "\"" 59 data_j_tni = "\"TNins\": \"" + data_E + "\"" 60 data_j = "\t{" + data_j_tna + ", " + data_j_tno + ", " + data_j_tni + ", " + data_j_l + "},\n" 61 if None == data_G2: 62 data_j = data_j[:-2] + "\n]" 63 data_j_all = data_j_all + data_j 64 start = start +1 65 66# Outputting to file 67file_path = str(path) + '/data/' + xl_name + '.json' 68file_j = open(file_path, mode = 'w', encoding = 'utf-8') 69file_j.write(data_j_all) 70file_j.close()

試したこと

エラー通りに書かれた通りに、64行目よりも前(#Converting の while文の前に「data_j = str("")」を追加)したところ、エラーはなくなりました。

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

Windows10(1803), Python3.7.3(32bit)

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

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

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

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

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

guest

回答2

0

問題のファイルは「未使用」から始まっているようです。
「未使用」の時の条件式がないのでdata_jが定義されずエラーになっているのでは?

投稿2019/06/08 08:03

mistn

総合スコア1191

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

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

0

ベストアンサー

ちゃんと読み込んで細かい挙動まで理解した訳ではありませんが、一般論としてif文のブロック内で変数を作ると、if文の条件式が真にならなかったときはブロックが実行されないので、そのせいで「変数が定義されていない」になることは珍しいことではありません。

思いっきり単純化して書くとこんな感じ。

python

1if False: 2 hoge = "hoge" 3print(hoge) # => NameError: name 'hoge' is not defined 4

条件が真にならなかったときのデフォルト値を予めブロックの外で代入しておけば、とりあえず変数が作られはします。入れたデフォルト値が本当にロジック的に正しいのかどうかは、しっかり精査する必要があると思いますけど。

投稿2019/06/08 07:51

編集2019/06/08 13:39
hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問