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

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

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

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

Q&A

解決済

1回答

1066閲覧

forループで困ってます

s2donalds2

総合スコア2

Python

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

0グッド

0クリップ

投稿2021/10/29 08:29

前提・実現したいこと

レースが不成立の場合そのレースを飛ばして次に進んでほしい。

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

不成立がでたレースでずっとループ?してる。

該当のソースコード

python

1ソースコード 2#解凍したテキストファイルの格納先を指定 3TEXT_FILE_DIR = "/content/drive/MyDrive/results_txt/" 4 5# CSVファイルの保存先を指定 6CSV_FILE_DIR = "/content/drive/MyDrive/results_csv_detail/" 7 8# CSVファイルの名前を指定 ※YYYYMMDDには対象期間を入力 9CSV_FILE_NAME = "results_20130101-20211021.csv" 10 11# CSVファイルのヘッダーを指定 12CSV_FILE_HEADER = "レースコード,タイトル,日次,レース日,レース場,\ 13レース回,レース名,距離(m),天候,風向,風速(m),波の高さ(cm),決まり手,\ 14単勝_艇番,単勝_払戻金,複勝_1着_艇番,複勝_1着_払戻金,複勝_2着_艇番,複勝_2着_払戻金,\ 152連単_組番,2連単_払戻金,2連単_人気,2連複_組番,2連複_払戻金,2連複_人気,\ 16拡連複_1-2着_組番,拡連複_1-2着_払戻金,拡連複_1-2着_人気,\ 17拡連複_1-3着_組番,拡連複_1-3着_払戻金,拡連複_1-3着_人気,\ 18拡連複_2-3着_組番,拡連複_2-3着_払戻金,拡連複_2-3着_人気,\ 193連単_組番,3連単_払戻金,3連単_人気,3連複_組番,3連複_払戻金,3連複_人気,\ 201着_着順,1着_艇番,1着_登録番号,1着_選手名,1着_モーター番号,1着_ボート番号,\ 211着_展示タイム,1着_進入コース,1着_スタートタイミング,1着_レースタイム,\ 222着_着順,2着_艇番,2着_登録番号,2着_選手名,2着_モーター番号,2着_ボート番号,\ 232着_展示タイム,2着_進入コース,2着_スタートタイミング,2着_レースタイム,\ 243着_着順,3着_艇番,3着_登録番号,3着_選手名,3着_モーター番号,3着_ボート番号,\ 253着_展示タイム,3着_進入コース,3着_スタートタイミング,3着_レースタイム,\ 264着_着順,4着_艇番,4着_登録番号,4着_選手名,4着_モーター番号,4着_ボート番号,\ 274着_展示タイム,4着_進入コース,4着_スタートタイミング,4着_レースタイム,\ 285着_着順,5着_艇番,5着_登録番号,5着_選手名,5着_モーター番号,5着_ボート番号,\ 295着_展示タイム,5着_進入コース,5着_スタートタイミング,5着_レースタイム,\ 306着_着順,6着_艇番,6着_登録番号,6着_選手名,6着_モーター番号,6着_ボート番号,\ 316着_展示タイム,6着_進入コース,6着_スタートタイミング,6着_レースタイム,\n" 32 33# OSの機能を利用するパッケージ os をインポート 34import os 35 36# 正規表現をサポートするモジュール re をインポート 37import re 38 39 40# テキストファイルからデータを抽出し、CSVファイルに書き込む関数 get_data を定義 41def get_data(text_file): 42 # CSVファイルを追記モードで開く 43 csv_file = open(CSV_FILE_DIR + CSV_FILE_NAME, "a", encoding="shift_jis") 44 45 # テキストファイルから中身を順に取り出す 46 for line in text_file: 47 48 # キーワード「競争成績」を見つけたら(rは正規表現でraw文字列を指定するおまじない) 49 if re.search(r"競走成績", line): 50 # 1行スキップ 51 text_file.readline() 52 53 # タイトルを格納 54 line = text_file.readline() 55 title = line[:-1].strip() 56 57 # 1行スキップ 58 text_file.readline() 59 60 # 日次・レース日・レース場を格納 61 line = text_file.readline() 62 day = line[3:7].replace(' ', '') 63 date = line[17:27].replace(' ', '0') 64 stadium = line[62:65].replace(' ', '') 65 66 # レース回の「R」と距離の「H」を同じ行に見つけたら -> これ以降に競走成績の詳細が記載 67 if re.search(r"R", line) and re.search(r"H", line): 68 69 # レース名にキーワード「進入固定」が割り込んだ際の補正(「進入固定戦隊」は除くためHまで含めて置換) 70 if re.search(r"進入固定", line): 71 line = line.replace('進入固定 H', '進入固定 H') 72 73 # レース回、レース名、距離(m)、天候、風向、風速(m)、波の高さ(cm)を取得 74 race_round = line[2:5].replace(' ', '0') 75 race_name = line[12:31].replace(' ', '') 76 distance = line[36:40] 77 weather = line[43:45].strip() 78 wind_direction = line[50:52].strip() 79 wind_velocity = line[53:55].strip() 80 wave_height = line[60:63].strip() 81 82 # 決まり手を取得 83 line = text_file.readline() 84 winning_technique = line[50:55].strip() 85 86 # 1行スキップ 87 text_file.readline() 88 89 # 選手データを格納する変数を定義 90 result_racer = "" 91 #選手データを取り出す行(開始行)を格納 92 line = text_file.readline() 93 94 # 空行まで処理を繰り返す = 1~6艇分の選手データを取得 95 while line != "\n": 96 # 選手データを格納(行末にカンマが入らないように先頭にカンマを入れる) 97 result_racer += "," + line[2:4] + "," + line[6] + "," + line[8:12] \ 98 + "," + line[13:21] + "," + line[22:24] + "," + line[27:29] \ 99 + "," + line[30:35].strip() + "," + line[38] + "," + line[43:47] \ 100 + "," + line[52:58] 101 102 # 次の行を読み込む 103 line = text_file.readline() 104 105 # レース結果を取り出す行(開始行)を格納 106 line = text_file.readline() 107 108 # 空行まで処理を繰り返す = レース結果を取得 109 while line != "\n": 110 111 # 単勝の結果を取得 112 if re.search(r"不成立", line,): 113 continue 114 if re.search(r"単勝", line,): 115 116 117 118 # 文字列「特払い」が割り込んだ際の補正 119 if re.search(r"特払い", line): 120 line = line.replace(' 特払い ', ' 特払い ') 121 122 result_win = line[15] + "," + line[22:29].strip() 123 124 # 複勝の結果を取得 125 if re.search(r"複勝", line): 126 127 # 文字列「特払い」が割り込んだ際の補正 128 if re.search(r"特払い", line): 129 line = line.replace(' 特払い ', ' 特払い ') 130 131 # 複勝_2着のデータが存在しない場合の分岐 132 if len(line) <= 33: 133 result_place_show = line[15] + "," + line[22:29].strip() \ 134 + "," + "," 135 else: 136 137 result_place_show = line[15] + "," + line[22:29].strip() \ 138 + "," + line[31] + "," + line[38:45].strip() 139 140 # 2連単の結果を取得 141 if re.search(r"2連単", line): 142 result_exacta = line[14:17] + "," + line[21:28].strip() \ 143 + "," + line[36:38].strip() 144 145 # 2連複の結果を取得 146 if re.search(r"2連複", line): 147 result_quinella = line[14:17] + "," + line[21:28].strip() \ 148 + "," + line[36:38].strip() 149 150 # 拡連複の結果を取得 151 if re.search(r"拡連複", line): 152 # 1-2着 153 result_quinella_place = line[14:17] + "," + line[21:28].strip() \ 154 + "," + line[36:38].strip() 155 156 # 1-3着 157 line = text_file.readline() 158 result_quinella_place += "," + line[17:20] + "," + line[24:31].strip() \ 159 + "," + line[39:41].strip() 160 161 # 2-3着 162 line = text_file.readline() 163 result_quinella_place += "," + line[17:20] + "," + line[24:31].strip() \ 164 + "," + line[39:41].strip() 165 166 # 3連単の結果を取得 167 if re.search(r"3連単", line): 168 result_trifecta = line[14:19] + "," + line[21:28].strip() \ 169 + "," + line[35:38].strip() 170 171 # 3連複の結果を取得 172 if re.search(r"3連複", line): 173 result_trio = line[14:19] + "," + line[21:28].strip() \ 174 + "," + line[35:38].strip() 175 176 # 次の行を読み込む 177 line = text_file.readline() 178 179 # レースコードを生成 180 dict_stadium = {'桐生': 'KRY', '戸田': 'TDA', '江戸川': 'EDG', '平和島': 'HWJ', 181 '多摩川': 'TMG', '浜名湖': 'HMN', '蒲郡': 'GMG', '常滑': 'TKN', 182 '津': 'TSU', '三国': 'MKN', '琵琶湖': 'BWK', '住之江': 'SME', 183 '尼崎': 'AMG', '鳴門': 'NRT', '丸亀': 'MRG', '児島': 'KJM', 184 '宮島': 'MYJ', '徳山': 'TKY', '下関': 'SMS', '若松': 'WKM', 185 '芦屋': 'ASY', '福岡': 'FKO', '唐津': 'KRT', '大村': 'OMR', 'びわこ': 'BWK' 186 } 187 188 race_code = date[0:4] + date[5:7] + date[8:10] + dict_stadium[stadium] + race_round[0:2] 189 190 # 抽出したデータをCSVファイルに書き込む 191 csv_file.write(race_code + "," + title + "," + day + "," + date + "," + stadium \ 192 + "," + race_round + "," + race_name + "," + distance + "," + weather \ 193 + "," + wind_direction + "," + wind_velocity + "," + wave_height \ 194 + "," + winning_technique + "," + result_win + "," + result_place_show \ 195 + "," + result_exacta + "," + result_quinella + "," + result_quinella_place \ 196 + "," + result_trifecta + "," + result_trio + result_racer + "\n") 197 198 # CSVファイルを閉じる 199 csv_file.close() 200 201 202# 開始合図 203print("作業を開始します") 204 205# CSVファイルを格納するフォルダを作成 206os.makedirs(CSV_FILE_DIR, exist_ok=True) 207 208# CSVファイルを作成しヘッダ情報を書き込む 209csv_file = open(CSV_FILE_DIR + CSV_FILE_NAME, "w", encoding="shift_jis") 210csv_file.write(CSV_FILE_HEADER) 211csv_file.close() 212 213# テキストファイルのリストを取得 214text_file_list = os.listdir(TEXT_FILE_DIR) 215 216# リストからファイル名を順に取り出す 217for text_file_name in text_file_list: 218 219 # 拡張子が TXT のファイルに対してのみ実行 220 if re.search(".TXT", text_file_name): 221 # テキストファイルを開く 222 text_file = open(TEXT_FILE_DIR + text_file_name, "r", encoding="shift_jis") 223 224 # 関数 get_data にファイル(オブジェクト)を渡す 225 get_data(text_file) 226 227 # テキストファイルを閉じる 228 text_file.close() 229 230print(CSV_FILE_DIR + CSV_FILE_NAME + " を作成しました") 231 232# 終了合図 233print("作業を終了しました")

![イメージ説明]
![イメージ説明]

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ループの最初のところで不成立かどうかを判断して、continueで、次のループに移ればいいです

投稿2021/10/29 08:40

y_waiwai

総合スコア88042

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

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

s2donalds2

2021/10/29 09:11

# テキストファイルから中身を順に取り出す for line in text_file: if re.search(r"不成立", line,): continue # キーワード「競争成績」を見つけたら(rは正規表現でraw文字列を指定するおまじない) if re.search(r"競走成績", line): # 1行スキップ 最初にしてみたらエラーがでました。 どうしたらいいですか? UnboundLocalError Traceback (most recent call last) <ipython-input-19-85e3621ca6f6> in <module>() 186 187 # 関数 get_data にファイル(オブジェクト)を渡す --> 188 get_data(text_file) 189 190 # テキストファイルを閉じる <ipython-input-19-85e3621ca6f6> in get_data(text_file) 157 158 # 抽出したデータをCSVファイルに書き込む --> 159 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") 160 161 # CSVファイルを閉じる UnboundLocalError: local variable 'result_win' referenced before assignment
y_waiwai

2021/10/29 09:24

それ入れなかったらエラーは出ないんでしょうか
s2donalds2

2021/10/29 09:30

エラーはでずに、ずっとループ?している感じです。
jbpb0

2021/10/29 10:08 編集

それは、質問内容が解決して次に進んだから出たエラーで、質問内容とは関係ないので、この質問は解決済みにして、新たに出たエラーは別の質問にしましょう ただし、別の質問する前に、下記を読んで、エラーの原因を自分なりに考えた方がいいと思うけど > local variable 'result_win' referenced before assignment
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問