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

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

新規登録して質問してみよう
ただいま回答率
85.46%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

解決済

1回答

8263閲覧

open関数で日本語タイトルのtxtを読み込むと中身でなく「_io.TextIOWrapper name=ファイルパス」が読み込まれる。

R_kun

総合スコア4

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

1クリップ

投稿2021/02/01 10:39

前提・実現したいこと

pythonにて東京23区の区名と駅名を入力すると、入力した区名が含まれるtxtファイルを検索し、当該のtxtファイルを読み込んで、入力した駅名が記載されている行数を返す関数を作成したいと考えております。

エラーは出力されずに終了するプログラムを作成できたのですが、駅名を変えても入力した区名が含まれるtxtファイルの行数+1を返すプログラムになっており、入力した駅名の検索が出来ていないことがわかりました。
(下記の例ですと、35行目までのtxtファイルを検索しきって、36行目を返してくる。)

print関数を用いて、途中のデータの状態を確認したところ、open関数でtxtファイルを読み込むところで、txtファイルの中身ではなく、「io.TextIOWrapper name=、、、」を読み込んでいることがわかりました。

open関数でtxtファイルを読み込むところで、txtファイルの中身ではなく、「io.TextIOWrapper name=」を読み込んでいる原因と解消方法についてご教示いただけると幸いです。

*open関数で読み込まれたファイルオブジェクト自体を文字列として読み込んでいるのかと思うのですが、何故そうなるのかと解消方法がわからず、ご教示いただけると幸いです。。。

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

--------------------------------------------------------------------------- 港区 六本木駅 ./input/港区の駅一覧.txt <_io.TextIOWrapper name='./input/\udce6\udcb8\udcaf\udce5\udc8c\udcba\udce3\udc81\udcae\udce9\udca7\udc85\udce4\udcb8\udc80\udce8\udca6\udca7\udcef\udcbc\udc88\udce8\udca6\udcb3\udce5\udc85\udc89\udcef\udcbc\udc89- \udce3\udc81\udc98\udce3\udc82\udc83\udce3\udc82\udc89\udce3\udc82\udc93net.txt' mode='r' encoding='utf-8'> serch 六本木駅 36 ---------------------------------------------------------------------------

該当のソースコード

python

1def getstationid(args1,args2): 2 for f in glob('./input/*.txt'): 3    if args1 in f: 4     file3 = str(f) 5     print(file3) 6     with open(file3, 'r', encoding='utf-8') as f1: 7      a = 1 8      x1 = 0 9      f2 = str(f1) 10      print(f2) 11      print("serch") 12      print(args2) 13      for src_data in f1: 14       if args2 in src_data: 15        break 16       else: 17        a = a +1 18      x1 = a 19 return x1

XXnettxt

1例)港区の駅一覧.txt 2青山一丁目駅 3赤坂駅 4赤坂見附駅 5赤羽橋駅 6麻布十番駅 7お台場海浜公園駅 8御成門駅 9表参道駅 10神谷町駅 11外苑前駅 12汐留駅 13品川駅 14芝浦ふ頭駅 15芝公園駅 16白金高輪駅 17白金台駅 18新橋駅 19泉岳寺駅 20高輪ゲートウェイ駅 21高輪台駅 22竹芝駅 23田町駅 24溜池山王駅 25台場駅 26大門駅 27虎ノ門駅 28虎ノ門ヒルズ駅 29乃木坂駅 30浜松町駅 31日の出駅 32広尾駅 33三田駅 34モノレール浜松町駅 35六本木駅 36六本木一丁目駅

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

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

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

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

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

showkit

2021/02/01 10:49

わたしが、答えられるかはわかりませんが、ファイル名、ファイルの中身に使用している文字コードが何かは、記述しておいた方がいいかと思います。
R_kun

2021/02/02 04:13

ありがとうございます。文字コードもわからないと正確な回答が出来ないですよね。今後文字コードを記載する様にいたします。
guest

回答1

0

ベストアンサー

f2 = str(f1)f2 = f1.read() にするのが簡単です。
ただし後続のコードをそのまま使いたいならば f1 = list(f1) が良いかもしれませんね。

*open関数で読み込まれたファイルオブジェクト自体を文字列として読み込んでいるのかと思う

文字列化しただけで勝手に読み込む仕様にはなっていないのです。

書いてみた

もうちょっと読み易くなるかなと思ったので。

Python

1def get_station_id(region_name: str, station_name: str) -> int: 2 # 該当するファイルあるいは行が無い場合の返り値 3 RET_LINE_NOT_FOUND = -1 4 5 # 該当するファイルを取得 6 file_names = [ 7 f_name 8 for f_name in glob('./input/*.txt') 9 if region_name in f_name 10 ] 11 print(file_names) 12 13 # 該当するファイルが無い場合 14 if not file_names: 15 return RET_LINE_NOT_FOUND 16 17 # 先頭のファイルだけ取り出し 18 file_name, *_ = file_names 19 with open(file_name, mode='r') as fin: 20 for i, line in enumerate(fin, start=1): 21 if station_name in line: 22 return i 23 24 # 該当する行が無い場合 25 return RET_LINE_NOT_FOUND

仕様を簡潔にするため、globで発見したファイルの内先頭しか見ていません。

投稿2021/02/01 10:56

編集2021/02/01 11:13
LouiS0616

総合スコア35660

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

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

R_kun

2021/02/02 04:09

ありがとうございます。 「with open(file3, 'r', encoding='utf-8') as f1」では文字列化しただけで、for文で初めて1行目から読み込まれていることが理解出来ました! コードの書き方も大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問