teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2021/02/01 11:13

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -3,4 +3,37 @@
3
3
 
4
4
  > *open関数で読み込まれたファイルオブジェクト自体を文字列として読み込んでいるのかと思う
5
5
 
6
- 文字列化しただけで勝手に読み込む仕様にはなっていないのです。
6
+ 文字列化しただけで勝手に読み込む仕様にはなっていないのです。
7
+
8
+ 書いてみた
9
+ ---
10
+ もうちょっと読み易くなるかなと思ったので。
11
+ ```Python
12
+ def get_station_id(region_name: str, station_name: str) -> int:
13
+ # 該当するファイルあるいは行が無い場合の返り値
14
+ RET_LINE_NOT_FOUND = -1
15
+
16
+ # 該当するファイルを取得
17
+ file_names = [
18
+ f_name
19
+ for f_name in glob('./input/*.txt')
20
+ if region_name in f_name
21
+ ]
22
+ print(file_names)
23
+
24
+ # 該当するファイルが無い場合
25
+ if not file_names:
26
+ return RET_LINE_NOT_FOUND
27
+
28
+ # 先頭のファイルだけ取り出し
29
+ file_name, *_ = file_names
30
+ with open(file_name, mode='r') as fin:
31
+ for i, line in enumerate(fin, start=1):
32
+ if station_name in line:
33
+ return i
34
+
35
+ # 該当する行が無い場合
36
+ return RET_LINE_NOT_FOUND
37
+ ```
38
+
39
+ 仕様を簡潔にするため、globで発見したファイルの内先頭しか見ていません。

1

追記

2021/02/01 11:13

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,4 +1,5 @@
1
- `f2 = str(f1)` を `f2 = f1.read()` にすれば良いです。
1
+ `f2 = str(f1)` を `f2 = f1.read()` にするのが簡単です。
2
+ ただし後続のコードをそのまま使いたいならば `f1 = list(f1)` が良いかもしれませんね。
2
3
 
3
4
  > *open関数で読み込まれたファイルオブジェクト自体を文字列として読み込んでいるのかと思う
4
5