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

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

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

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

Q&A

1回答

984閲覧

UnboundLocalErrorについて教えて下さい

s2donalds2

総合スコア2

Python

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

0グッド

0クリップ

投稿2021/10/23 05:20

前提・実現したいこと

UnboundLocalErrorがでて困っている

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

エラーメッセージ --------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) <ipython-input-24-11fd1eaf2160> in <module>() 182 183 # 関数 get_data にファイル(オブジェクト)を渡す --> 184 get_data(text_file) 185 186 # テキストファイルを閉じる <ipython-input-24-11fd1eaf2160> in get_data(text_file) 153 154 # 抽出したデータをCSVファイルに書き込む --> 155 csv_file.write(race_code + "," + title + "," + day + "," + date + "," + stadium + "," + race_round + "," + race_name + "," + distance + "," + weather + "," + wind_direction + "," + wind_velocity + "," + wave_height + "," + winning_technique + "," + result_win + "," + result_place_show + "," + result_exacta + "," + result_quinella + "," + result_quinella_place + "," + result_trifecta + "," + result_trio + result_racer + "\n") 156 157 # CSVファイルを閉じる UnboundLocalError: local variable 'result_win' referenced before assignment

該当のソースコード

python ソースコード #解凍したテキストファイルの格納先を指定 TEXT_FILE_DIR = "/content/drive/MyDrive/results_txt/" # CSVファイルの保存先を指定 CSV_FILE_DIR = "/content/drive/MyDrive/results_csv_detail/" # CSVファイルの名前を指定 ※YYYYMMDDには対象期間を入力 CSV_FILE_NAME = "results_20130101-20211021.csv" # CSVファイルのヘッダーを指定 CSV_FILE_HEADER = "レースコード,タイトル,日次,レース日,レース場,\ レース回,レース名,距離(m),天候,風向,風速(m),波の高さ(cm),決まり手,\ 単勝_艇番,単勝_払戻金,複勝_1着_艇番,複勝_1着_払戻金,複勝_2着_艇番,複勝_2着_払戻金,\ 2連単_組番,2連単_払戻金,2連単_人気,2連複_組番,2連複_払戻金,2連複_人気,\ 拡連複_1-2着_組番,拡連複_1-2着_払戻金,拡連複_1-2着_人気,\ 拡連複_1-3着_組番,拡連複_1-3着_払戻金,拡連複_1-3着_人気,\ 拡連複_2-3着_組番,拡連複_2-3着_払戻金,拡連複_2-3着_人気,\ 3連単_組番,3連単_払戻金,3連単_人気,3連複_組番,3連複_払戻金,3連複_人気,\ 1着_着順,1着_艇番,1着_登録番号,1着_選手名,1着_モーター番号,1着_ボート番号,\ 1着_展示タイム,1着_進入コース,1着_スタートタイミング,1着_レースタイム,\ 2着_着順,2着_艇番,2着_登録番号,2着_選手名,2着_モーター番号,2着_ボート番号,\ 2着_展示タイム,2着_進入コース,2着_スタートタイミング,2着_レースタイム,\ 3着_着順,3着_艇番,3着_登録番号,3着_選手名,3着_モーター番号,3着_ボート番号,\ 3着_展示タイム,3着_進入コース,3着_スタートタイミング,3着_レースタイム,\ 4着_着順,4着_艇番,4着_登録番号,4着_選手名,4着_モーター番号,4着_ボート番号,\ 4着_展示タイム,4着_進入コース,4着_スタートタイミング,4着_レースタイム,\ 5着_着順,5着_艇番,5着_登録番号,5着_選手名,5着_モーター番号,5着_ボート番号,\ 5着_展示タイム,5着_進入コース,5着_スタートタイミング,5着_レースタイム,\ 6着_着順,6着_艇番,6着_登録番号,6着_選手名,6着_モーター番号,6着_ボート番号,\ 6着_展示タイム,6着_進入コース,6着_スタートタイミング,6着_レースタイム,\n" # OSの機能を利用するパッケージ os をインポート import os # 正規表現をサポートするモジュール re をインポート import re # テキストファイルからデータを抽出し、CSVファイルに書き込む関数 get_data を定義 def get_data(text_file): # CSVファイルを追記モードで開く csv_file = open(CSV_FILE_DIR + CSV_FILE_NAME, "a", encoding="shift_jis") # テキストファイルから中身を順に取り出す for line in text_file: # キーワード「競争成績」を見つけたら(rは正規表現でraw文字列を指定するおまじない) if re.search(r"競走成績", line): # 1行スキップ text_file.readline() # タイトルを格納 line = text_file.readline() title = line[:-1].strip() # 1行スキップ text_file.readline() # 日次・レース日・レース場を格納 line = text_file.readline() day = line[3:7].replace(' ', '') date = line[17:27].replace(' ', '0') stadium = line[62:65].replace(' ', '') # レース回の「R」と距離の「H」を同じ行に見つけたら -> これ以降に競走成績の詳細が記載 if re.search(r"R", line) and re.search(r"H", line): # レース名にキーワード「進入固定」が割り込んだ際の補正(「進入固定戦隊」は除くためHまで含めて置換) if re.search(r"進入固定", line): line = line.replace('進入固定 H', '進入固定 H') # レース回、レース名、距離(m)、天候、風向、風速(m)、波の高さ(cm)を取得 race_round = line[2:5].replace(' ', '0') race_name = line[12:31].replace(' ', '') distance = line[36:40] weather = line[43:45].strip() wind_direction = line[50:52].strip() wind_velocity = line[53:55].strip() wave_height = line[60:63].strip() # 決まり手を取得 line = text_file.readline() winning_technique = line[50:55].strip() # 1行スキップ text_file.readline() # 選手データを格納する変数を定義 result_racer = "" # 選手データを取り出す行(開始行)を格納 line = text_file.readline() # 空行まで処理を繰り返す = 1~6艇分の選手データを取得 while line != "\n": # 選手データを格納(行末にカンマが入らないように先頭にカンマを入れる) result_racer += "," + line[2:4] + "," + line[6] + "," + line[8:12] \ + "," + line[13:21] + "," + line[22:24] + "," + line[27:29] \ + "," + line[30:35].strip() + "," + line[38] + "," + line[43:47] \ + "," + line[52:58] # 次の行を読み込む line = text_file.readline() # レース結果を取り出す行(開始行)を格納 line = text_file.readline() # 空行まで処理を繰り返す = レース結果を取得 while line != "\n": # 単勝の結果を取得 if re.search(r"単勝", line): # 文字列「特払い」が割り込んだ際の補正 if re.search(r"特払い", line): line = line.replace(' 特払い ', ' 特払い ') result_win = line[15] + "," + line[22:29].strip() # 複勝の結果を取得 if re.search(r"複勝", line): # 文字列「特払い」が割り込んだ際の補正 if re.search(r"特払い", line): line = line.replace(' 特払い ', ' 特払い ') # 複勝_2着のデータが存在しない場合の分岐 if len(line) <= 33: result_place_show = line[15] + "," + line[22:29].strip() \ + "," + "," else: result_place_show = line[15] + "," + line[22:29].strip() \ + "," + line[31] + "," + line[38:45].strip() # 2連単の結果を取得 if re.search(r"2連単", line): result_exacta = line[14:17] + "," + line[21:28].strip() \ + "," + line[36:38].strip() # 2連複の結果を取得 if re.search(r"2連複", line): result_quinella = line[14:17] + "," + line[21:28].strip() \ + "," + line[36:38].strip() # 拡連複の結果を取得 if re.search(r"拡連複", line): # 1-2着 result_quinella_place = line[14:17] + "," + line[21:28].strip() \ + "," + line[36:38].strip() # 1-3着 line = text_file.readline() result_quinella_place += "," + line[17:20] + "," + line[24:31].strip() \ + "," + line[39:41].strip() # 2-3着 line = text_file.readline() result_quinella_place += "," + line[17:20] + "," + line[24:31].strip() \ + "," + line[39:41].strip() # 3連単の結果を取得 if re.search(r"3連単", line): result_trifecta = line[14:19] + "," + line[21:28].strip() \ + "," + line[35:38].strip() # 3連複の結果を取得 if re.search(r"3連複", line): result_trio = line[14:19] + "," + line[21:28].strip() \ + "," + line[35:38].strip() # 次の行を読み込む line = text_file.readline() # レースコードを生成 dict_stadium = {'桐生': 'KRY', '戸田': 'TDA', '江戸川': 'EDG', '平和島': 'HWJ', '多摩川': 'TMG', '浜名湖': 'HMN', '蒲郡': 'GMG', '常滑': 'TKN', '津': 'TSU', '三国': 'MKN', '琵琶湖': 'BWK', '住之江': 'SME', '尼崎': 'AMG', '鳴門': 'NRT', '丸亀': 'MRG', '児島': 'KJM', '宮島': 'MYJ', '徳山': 'TKY', '下関': 'SMS', '若松': 'WKM', '芦屋': 'ASY', '福岡': 'FKO', '唐津': 'KRT', '大村': 'OMR', 'びわこ': 'BWK' } race_code = date[0:4] + date[5:7] + date[8:10] + dict_stadium[stadium] + race_round[0:2] # 抽出したデータをCSVファイルに書き込む csv_file.write(race_code + "," + title + "," + day + "," + date + "," + stadium \ + "," + race_round + "," + race_name + "," + distance + "," + weather \ + "," + wind_direction + "," + wind_velocity + "," + wave_height \ + "," + winning_technique + "," + result_win + "," + result_place_show \ + "," + result_exacta + "," + result_quinella + "," + result_quinella_place \ + "," + result_trifecta + "," + result_trio + result_racer + "\n") # CSVファイルを閉じる csv_file.close() # 開始合図 print("作業を開始します") # CSVファイルを格納するフォルダを作成 os.makedirs(CSV_FILE_DIR, exist_ok=True) # CSVファイルを作成しヘッダ情報を書き込む csv_file = open(CSV_FILE_DIR + CSV_FILE_NAME, "w", encoding="shift_jis") csv_file.write(CSV_FILE_HEADER) csv_file.close() # テキストファイルのリストを取得 text_file_list = os.listdir(TEXT_FILE_DIR) # リストからファイル名を順に取り出す for text_file_name in text_file_list: # 拡張子が TXT のファイルに対してのみ実行 if re.search(".TXT", text_file_name): # テキストファイルを開く text_file = open(TEXT_FILE_DIR + text_file_name, "r", encoding="shift_jis") # 関数 get_data にファイル(オブジェクト)を渡す get_data(text_file) # テキストファイルを閉じる text_file.close() print(CSV_FILE_DIR + CSV_FILE_NAME + " を作成しました") # 終了合図 print("作業を終了しました")

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

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

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

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

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

guest

回答1

0

python

1 if re.search(r"単勝", line): 2 3 # 文字列「特払い」が割り込んだ際の補正 4 if re.search(r"特払い", line): 5 line = line.replace(' 特払い ', ' 特払い ') 6 7 result_win = line[15] + "," + line[22:29].strip()

で"単勝"が見つからない場合にこのエラーが起きます。

データ次第なので、なんとも言えませんが、forループの最初で初期化しておくという方法もあります。

投稿2021/10/23 05:50

ppaul

総合スコア24666

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

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

s2donalds2

2021/10/25 06:18

データ自体はこんな感じの繰り返しなんですけどどうしたらいいですか? STARTK 24KBGN 大 村[成績] 1/ 1 九州スポーツ杯 新春 第 1日 *** 競走成績 *** 九州スポーツ杯 新春特選レース           第 1日 2013/ 1/ 1 ボートレース大 村 −内容については主催者発行のものと照合して下さい− [払戻金] 3連単 3連複 2連単 2連複 1R 1-6-2 6880 1-2-6 1570 1-6 2130 1-6 2950 2R 1-5-4 1870 1-4-5 310 1-5 760 1-5 670 3R 3-2-1 6440 1-2-3 400 3-2 3000 2-3 1220 4R 6-3-1 2740 1-3-6 930 6-3 430 3-6 320 5R 1-4-2 830 1-2-4 360 1-4 230 1-4 200 6R 5-4-2 8860 2-4-5 1510 5-4 1650 4-5 620 7R 3-4-1 1760 1-3-4 250 3-4 890 3-4 360 8R 3-1-4 4410 1-3-4 1110 3-1 830 1-3 270 9R 2-5-3 790 2-3-5 370 2-5 250 2-5 230 10R 1-6-2 960 1-2-6 310 1-6 430 1-6 420 11R 5-2-1 8110 1-2-5 400 5-2 3480 2-5 1150 12R 1-3-4 870 1-3-4 350 1-3 340 1-3 250 1R めざまし戦予 H1800m 曇り 風 南東  2m 波  1cm 着 艇 登番  選 手 名  モーター ボート 展示 進入 スタートタイミンク レースタイム 抜き    ------------------------------------------------------------------------------- 01 1 4096 石 橋  道 友 39 12 6.72 1 0.14 1.46.7 02 6 4705 吉 川  勇 作 50 66 6.76 6 0.13 1.47.3 03 2 3818 山 崎  康 弘 56 59 6.70 2 0.26 1.50.4 04 4 3765 澤 中  信 吾 29 20 6.79 4 0.38 1.51.7 05 3 2505 小 泉  秀 人 47 57 6.77 3 0.39 . . 06 5 4552 杉 山  勝 匡 19 75 6.65 5 0.36 . . 単勝 1 100 複勝 1 100 6 350 2連単 1-6 2130 人気 5 2連複 1-6 2950 人気 5 拡連複 1-6 640 人気 9 1-2 130 人気 1 2-6 1670 人気 13 3連単 1-6-2 6880 人気 16 3連複 1-2-6 1570 人気 6 2R 朝ガチ戦予戦 H1800m 曇り 風 南東  2m 波  1cm 着 艇 登番  選 手 名  モーター ボート 展示 進入 スタートタイミンク レースタイム 逃げ    ------------------------------------------------------------------------------- 01 1 4171 榎    幸 司 15 44 6.68 1 0.19 1.47.7 02 5 4248 岡 本    大 73 26 6.66 5 0.24 1.48.8 03 4 3777 樋 口    亮 43 24 6.74 4 0.29 1.52.3 04 6 3964 宮 地  博 士 21 61 6.73 6 0.22 1.53.5 S0 2 2568 中 村  義 雄 17 17 6.66 2 0.24 . . S2 3 2795 吉 野  光 弘 61 58 6.78 3 0.25 . . 単勝 1 100 複勝 1 100 5 230 2連単 1-5 760 人気 4 2連複 1-5 670 人気 3 拡連複 1-5 190 人気 4 1-4 100 人気 1 4-5 190 人気 3 3連単 1-5-4 1870 人気 7 3連複 1-4-5 310 人気
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問