pythonでファイルを1行ずつ読み込み。1行ずつ書き込み。

必要となる知識

  • f.open(‘filename’, ‘w’) → wは書き込みモードでファイルを開く。この場合読み込み系のメソッドを使うと、UnsupportedOperation: not readableエラーが発生する
  • f.open(‘filename’) → 読み込みを行いたい場合は第一引数のみにする
  • f.open(‘filename’, ‘r’) → 読み込みを行いたい場合はもしくは第二引数にrを指定する
  • f.open(‘filename’, ‘a’) → aにすると追記モードになる。

pythonでファイルを1行ずつ読み込むひな型コード

いろいろなやり方はあると思うけど、readline()メソッドとwhile文を組み合わせるやり方がすっきりかけるみたい。

f = open('filepath')
line = f.readline()
while line:
    line = f.readline()
    print(line)
f.close()

上記のコードはQitaで公開されているが、これを実行するとなぜか1行目がとばされる。考えたらわかるかもしれないけどとりあえず上記コードはボツ。

while以外だとなにも考えずにfor文も使えるようだ。あとwith構文をつかうとclose()する必要がなくなるのでそれもいい。

with open('filepath', 'r') as f:
    for line in f:
        print(line)

これだと問題なく1行ずつ読みこめた。

1行ずつ読み込んだあと1行ずつ書き込む

pythonははじめの「必要となる知識」のとこに書いたように、読み込みと書き込みが同時にできない。そのため一旦読み込みモードでコンテンツを読みこんだあとに、また書き込みモードでファイルを開いて書き込む必要があると思う。

以下は「1行ずつ読み込んだあと1行ずつ書き込む」サンプルコードだ。

# 書き込み用配列作成
contents = []

# 1行ずつファイルの読み込み
with open('filepath', 'r') as f:
    for line in f:
        line = line.replace(' ', ',')
        contents.append(line)

# 1行ずつ書き込み
with open('filepath', 'w') as f:
    for content in contents:
        f.write(content)

この構文に追加で書き込まれたものを表示したいなら再度該当ファイルを開いてprint()で表示してやればいいと思う。書き込まれた改行がきになるところだが、リストを作成するときは改行も含まれるので、書き込んだ結果は改行された状態になっている。