ファイルのopenとclose
ファイルをオープンするにはopen関数、クローズするにはcloseメソッドを使う。
f = open("sample.txt", "r")
(何らかの処理)
f.close()
openの戻り値はファイルオブジェクトで、ファイルへの入出力にはこのファイルオブジェクトを使う。
2番目の引数はモードで次のモードが指定できる。
r | 読み込みモード |
w | 書き込みモード。既存のファイルには上書きする |
a | 追加書き込みモード |
ほかにもあるけど省略。
ファイルの読み込み
ファイルの内容すべてをいっぺんに読み込むには、readメソッド。
import sys
filename = sys.argv[1]
file = open(filename, "r")
contents = file.read()
print contents
file.close()
実行結果:
^o^ > type sample.txt Mon Tue Wed Thu Fri Sat Sun ^o^ > python file_read.py sample.txt Mon Tue Wed Thu Fri Sat Sun
ファイルを1行ずつ読み込むには、readlineを使う。
import sys
filename = sys.argv[1]
file = open(filename, "r")
while True:
line = file.readline()
if not line:
break
print line.rstrip("\n")
file.close()
whileループの中で1行ずつ読み込んで出力している。ファイルの最後に到達すると空文字列が返ってくるんだろうか、そこでbreakしてループを抜け出している。
あと、print文は最後に改行を出力するので、lineの最後についている改行文字をrstripで取り去っている。このprintの改行を出力する動作はおせっかいに思えてならない。
readlinesはファイルすべてを行ごとに分割して、文字列のリストを返す。
import sys
filename = sys.argv[1]
file = open(filename, "r")
for line in file.readlines():
print line.rstrip("\n")
file.close()
大きなファイルでなければこの方がすっきり書ける。
さらに、readlinesを使わなくてもファイルオブジェクト自体をforに渡すことで、1行ずつ処理することができる。このやり方だと大きなファイルでも大丈夫みたい。
import sys
filename = sys.argv[1]
file = open(filename, "r")
for line in file:
print line.rstrip("\n")
file.close()
ファイルへの書き込み
ファイルへの書き込みは、writeメソッド。
import sys
filename = sys.argv[1]
file = open(filename, "w")
file.write("Hello, world.\n")
file.close()
実行結果:
^o^ > python file_write.py sample.out ^o^ > type sample.out Hello, world.
writeメソッドは余計な改行文字を出力しないから素直でいいね。
writelinesは文字列のリストを受け取って、ファイルに出力する。
import sys
filename = sys.argv[1]
seq = ["foo\n", "bar\n", "baz\n"]
file = open(filename, "w")
file.writelines(seq)
file.close()
実行結果:
^o^ > python file_writelines.py sample.out ^o^ > type sample.out foo bar baz