Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
前回
8. データの行き先
8.1 ファイル入出力
8.1.1 フラットファイル
最も単純なタイプの永続記憶はフラットファイルで、ファイル名の下に格納された唯のバイト列である。ファイルからメモリに読み出し、メモリからファイルに書き込む。
ファイルは読み書きする前に開く必要がある。
# 例:ファイルを開く fileobj = open(filename, mode)
()が返すファイルオブジェクト | |
ファイルに付けられた名前で文字列 | |
ファイルのタイプやファイルの操作方法を知らせる文字列で2文字から成る。1文字目は ・:読み出し ・:書き込み*2 ・:ファイルがまだ存在しないときに書き込む ・:ファイルが存在する場合、追記 2文字目はファイルのタイプで、 ・:テキスト ・:バイナリ |
ファイルを開いたら、データを読み書きする関数を呼び出し、最後にファイルを閉じる。
#################################### ### ファイルを書き込む簡単な方法 ### #################################### poem = '''There was a young lady named Bright, Whose speed was far faster than light; She started one day In a relative way, And returned on the previous night.''' # relativityというファイルにpoemを書き込む fout = open('relativity', 'wt') # relativityを開く fout.write(poem) # poemをファイルオブジェクトfoutに書き込む fout.close() # foutを閉じる # write()関数以外にprint()でテキストファイルに書き込むことができる fout = open('relativity', 'wt') print(poem, file = fout) fout.close() # ファイルが重要であれば、xモードとtryを用いることが考えられる try: fout = open('relativity', 'xt') fout.write('stomp stomp stomp') except FileExistsError: print('relativity already exists! That was a close one.')
8.1.2 read(),readline(),readlines()
引数無しで()を呼び出すことでファイル全体を一度に読み込むことができる。ただし大きなファイルでこれを行なうときにはそのサイズ分のメモリをそのまま消費することになる。
# relativityファイルにpoemが書き込まれているとする # 一度にすべての書き込み内容を読み込む fin = open('relativity', 'rt') poem = fin.read() fin.close() # 一度に読み込む字数に上限を設けるには引数にその文字数を与える poem = '' fin = open('relativity', 'rt') chunk = 100 while True: fragment = fin.read(chunk) if not fragment: break poem += fragment fin.close() poem = '' fin = open('relativity', 'rt') chunk = 100 # 1行ずつ読み込む場合 while True: line = fin.readline() if not line: break poem += line fin.close() # イテレータを用いる方法 poem = '' fin = oepn('relativity', 'rt') for line in fin: poem += line fin.close()
8.1.3 バイナリモード
()呼び出しのモード文字列に''を用いると、ファイルはバイナリモードで開かれる。
()の場合はモードとして''を指定して開けばよい。
8.1.4 withによる自動的なクローズ
ファイルが自動的にクローズするようにするには、を用いればよい。
with open('relativity', 'wt') as fout: fout.write(poem)