01 / 07
丸ごとでは扱いにくい
read は中身をまるごと1つの文字列にして返す。短いメモならそれでいいけれど、行ごとに何かしたいときは困るよね。
「点数が書かれた行を全部足したい」「3文字以上の行だけ表示したい」。こういうときに欲しいのは、1行ずつ取り出す方法だよ。
ファイルを読み書きする
INPUT · スライド
01 / 07
read は中身をまるごと1つの文字列にして返す。短いメモならそれでいいけれど、行ごとに何かしたいときは困るよね。
「点数が書かれた行を全部足したい」「3文字以上の行だけ表示したい」。こういうときに欲しいのは、1行ずつ取り出す方法だよ。
02 / 07
その方法が、拍子抜けするほど簡単なんだ。for gyou in f: と書くだけ。リストを回すのとまったく同じ形だよ。
ただし1つ注意がある。取り出される行には、末尾の改行が付いたまま来る。だから print すると空行が混ざるよ。
with open("memo.txt", "w") as f: f.write("あさ\nひる\nよる\n")with open("memo.txt") as f: for gyou in f: print(gyou)実行結果
あさ ひる よる
03 / 07
前のレッスンで使った strip を、1行ごとにかければいい。gyou.strip() と書くだけだよ。
ファイルを for で回すときは、strip をセットで書く。そう覚えてしまっていいくらい、よく出てくる組み合わせだよ。
with open("memo.txt", "w") as f: f.write("あさ\nひる\nよる\n")with open("memo.txt") as f: for gyou in f: print(gyou.strip())実行結果
あさ ひる よる
04 / 07
いま書いたコードを、リストを回すコードと並べてみよう。in のうしろが違うだけで、あとは何も変わっていない。
これは偶然ではないよ。リストも、文字列も、辞書も、ファイルも、同じ for で回せるように Python が設計されているんだ。
「回せるもの」には共通の約束ごとがあって、for はその約束だけを頼りに動いている。その正体は第8章で明かす。いまは「同じ書きかたがあちこちで効く」と気づいておくだけで十分だよ。
kudamonos = ["りんご", "みかん"]for kudamono in kudamonos: print(kudamono)with open("memo.txt", "w") as f: f.write("りんご\nみかん\n")with open("memo.txt") as f: for gyou in f: print(gyou.strip())実行結果
りんご みかん りんご みかん
05 / 07
もうひとつの読みかたが readlines。全部の行をリストにして返してくれるよ。
リストになるので、len で行数を数えたり、[0] で最初の行を取り出したりできる。ただし改行はやはり残っているので、表示するときは strip が要るよ。
with open("memo.txt", "w") as f: f.write("あさ\nひる\nよる\n")with open("memo.txt") as f: gyous = f.readlines()print(gyous)print(len(gyous))実行結果
['あさ\n', 'ひる\n', 'よる\n'] 3
06 / 07
2つのやりかたは、こう選ぼう。
for gyou in f: … 1行読んでは処理し、また1行読む。どんなに大きなファイルでも軽いf.readlines() … 全部の行をいっぺんにリストに載せる。行数を数えたい・あとから何度も見たいときに迷ったら for でいい。何百万行のファイルを readlines で読むと、そのぶん全部がメモリに載ってしまうからね。
with open("memo.txt", "w") as f: f.write("あさ\nひる\nよる\n")with open("memo.txt") as f: gyous = f.readlines()print(f"{len(gyous)}ぎょう")実行結果
3ぎょう
07 / 07
1行ずつ読む方法は2つだった。
for gyou in f: で回す。gyou.strip() で改行を落とすf.readlines() でリストにするそして大事な気づきがもうひとつ。第2章で覚えた for が、そのままファイルに効いた。この「同じ書きかたが効く」感覚は、覚えておいてね。
ここまでで「読む」はひととおり。次のグループでは、いよいよ書くほうをきちんと扱うよ。"w" と "a" の違いや、うっかりファイルを空にしてしまう事故の話をするね。