Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonでファイルを読み込む時に使うf.read()とf.readlines()の違いを解説します

f:id:kenken0326:20210122115526p:plain

こんにちはPyQサポートです。
今回はPythonでファイルを読み込む時に使うf.read()f.readlines()の違いを解説します。

質問

f.read()f.readlines()はどちらもファイルから読み込む時に使うことは分かりますが、明確な違いがわからないので教えてください。
下記の問題ではf.readlines()を使っていましたが、実行結果は"コナツ製薬は、0回出現します"と表示されました。その後f.read()を使ったところ正しく6回カウントされました。

f.read()を使って読み込んだコード

f = open("input/schedule_202004.txt")
schedule = f.read()
f.close()
print("コナツ製薬は、", schedule.count("コナツ製薬"), "回出現します")

実行結果

コナツ製薬は、 6 回出現します

f.readlines()を使って読み込んだコード

f = open('input/schedule_202004.txt', 'r', encoding='utf-8')
schedule = f.readlines()
f.close()

print("コナツ製薬は、", schedule.count("コナツ製薬"), "回出現します")

実行結果

コナツ製薬は、 0 回出現します

回答

f.read()f.readlines()の違い

まずはf.read()f.readlines()の違いを解説します。

これらは戻ってくるデータの形が違います。

  • f.read()はテキストファイルの中身を1つの大きな文字列データとして戻します
  • f.readlines()はテキストファイルの中身を改行文字で区切って一行ずつに分割して、リストとしてデータを返します。

それぞれのメソッドから戻ってきた、データをprint()してみましょう。

print(f.read())の実行結果

改行も含めた1つの大きな文字列データとしてデータが取得できます。

print(f.read())

"4/27 14:00 テルケイ薬局 浅井様 訪問
04/28 11:00 コナツ製薬 山田様 訪問
04/28 14:00 コナツ製薬 山田様 訪問
04/28 15:00 ナイホウ商事 鈴木様 メール連絡
04/29 13:00 コナツ製薬 山田様 訪問
04/29 14:00 ナイホウ商事 鈴木様 メール連絡
04/30 11:00 カタヒント物産 桜田様 電話会議
04/30 13:00 コナツ製薬 山田様 電話会議
04/30 15:00 カタヒント物産 桜田様"

print(f.readlines())の実行結果

改行コードを区切って一行一行に分解されたリストのデータが取得できます。

print(f.readlines())

[
 '04/01 11:00 コナツ製薬 山田様 訪問\n', 
 '04/01 13:00 スーパー大谷 竹野内様 メール連絡\n',  
 '04/02 14:00 関数薬局 加藤様 メール連絡\n',
 '04/03 11:00 カタヒント物産 桜田様 訪問\n',
 '04/03 13:00 テルケイ薬局 浅井様訪問\n', 
 '04/04 14:00 テルケイ薬局 浅井様 メール連絡\n',
 '04/04 15:00 スーパー大谷 竹野内様 訪問\n',
 '04/05 11:00 テルケイ薬局 浅井様 訪問\n',
 '04/05 13:00 関数薬局 高橋様 メール連絡\n',
  ~ 省略 ~ 
]

補足ですが、f.readlines()の代わりに、リストの要素に余計な改行が入らないようにf.read().splitlines()の方が使いやすいこともあります(しかしf.readlines()の方がメモリの使用量が少なく済みます)。

文字列のcount()について

次はなぜf.readlines()を使うと、実行結果が0回になるのか解説します。

f.read()の結果の文字列をcount()は、文字列内にcount()の引数に指定した文字列が何回登場するかをカウントしています。

組み込み型 — Python 3.9.1 ドキュメント

一方で、f.readlines()の結果のリストをcount()は、カウントしています。
この場合、count()の引数に指定した文字列が完全に一致するリスト内の要素の数をカウントしています。

5. データ構造 — Python 3.9.1 ドキュメント

そのため、リストの中に "コナツ製薬" と完全に一致する要素が存在しないので、0回と出力されています。

まとめ

  • f.readlines()は、一行一行処理したい時に使いましょう。
  • f.read()は、1つの文字列データとして扱いたい時に使いましょう。
Copyright ©2017- BeProud Inc. All rights reserved.