ファイルのオープンとクローズ、with文を使った書き方からテキストファイルやバイナリファイルの読み書き、structモジュールまでをギュッとまとめた。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ファイルを扱う上での基本となる組み込みのopen関数、with文との組み合わせ、テキストファイルの読み書き、バイナリファイルの読み書きについて見ていこう。
なお、ファイルの操作については以下の記事も参考にしてほしい。
ファイルは組み込みのopen関数を用いてオープンし、それに対して読み込み、書き込みを行った後、クローズするのが通常のファイル操作の手順となる。その流れを以下にまとめる。
file = open(ファイル名, モード, その他の引数) # ファイルのオープン
content = file.read() # 読み込みの例
file.write('foo') # 書き込みの例
file.close() # ファイルのクローズ
あるいは、with文を使用することで、ファイルのクローズを自動的に行うことも可能だ。例外処理
with open(ファイル名, モード, その他の引数) as file: # ファイルのオープン
content = file.read() # 読み込みの例
file.write('foo') # 書き込みの例。ブロック終了後にファイルはクローズされる
with文でファイルを扱うときには、そのブロックが終了すると、ファイルが自動的にクローズされる。with文はファイル操作中に例外が発生しても、そのクローズが確実に行えるので、こちらの使い方が推奨されている。
ファイルのオープンに使用する組み込みのopen関数の構文は次のようになっている。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
それぞれのパラメーターの意味は以下の通り。
modeパラメーターには以下を指定できる。
'+'は'r'、'w'、'a'、'x'と一緒に指定して、そのファイルを読み書き両用にオープンする。
open関数でmodeパラメーターに'rt'(または単に'r')を指定するとテキストファイルを読み込み用にオープンできる。modeパラメーターに'wt'などを指定すると、テキストファイルを書き込み用にオープンできる。Pythonのテキストファイルは「文字列の読み書き」を行う。整数など、文字列以外のものは書式化して、文字列に埋め込む必要があるので注意しよう。
テキストファイルを読み込むメソッドとしては以下がある。
これらのメソッドはファイルの末尾まで読み込みが終わると、その後に呼び出しを行うと空文字列を返す。空文字列は「偽」として扱われるので、これを使ってループの繰り返しを制御できる(ファイル中の空行には改行文字のみが含まれるので、空文字列とはならない)。また、open関数の戻り値であるファイルオブジェクト自身はその各行を返送する反復可能オブジェクトとしても使用できる。
テキストファイルに書き込みを行うメソッドとしては以下がある。
これらのメソッドでは、sizeパラメーター(読み込む文字数)やhintパラメーター(読み込む行数。readlinesメソッドの場合)を指定できる。
modeパラメーターに'wt'を指定した場合を例として、これらのメソッドの使い方を以下に示す。
with open('foo.txt', 'wt') as file: # 'foo.txt'ファイルを書き込み用にオープン
mylist = ['foo', '', 'bar']
for num, item in enumerate(mylist):
file.write(f'{num}: {item}\n') # f文字列に行カウントを埋め込み
# writelinesメソッドでは各要素の末尾に改行文字が追加されないので自分で追加
file.writelines([item.upper() + '\n' for item in mylist])
file = open('foo.txt')
print(file.read()) # ファイルの内容を全て読み込む
file.seek(0) # seekメソッドに0を渡してファイル先頭をファイル位置にする
line = file.readline() # ファイルの内容を1行ずつ読み込む
while line: # 変数lineの内容が空文字列となるまで(ファイル末尾となるまで)
print(line, end='') # 各要素には改行文字が含まれている
line = file.readline() # 次の行を読み込む
file.seek(0)
lines = file.readlines() # 全ての行を読み込む
for line in lines: # その内容をfor文でループ
print(line, end='')
file.seek(0)
for line in file: # ファイルオブジェクトを使って繰り返し
print(line, end='')
file.close() # 使い終わったらファイルを閉じる
上の例では、ファイルオブジェクトのseekメソッドを用いて、各行の表示が終わった後にもう一度ファイル先頭にファイル位置を移動するようにしている。ファイルオブジェクトが持つその他のメソッドについてはPythonのドキュメント「io --- ストリームを扱うコアツール」にある「TextIOBase」などを参照のこと。例えば、現在のファイル位置を知る「tellメソッド」などがある。
バイナリファイルの読み書きを行うには、open関数のmodeパラメーターに'b'を付加する。'rb'ならバイナリファイルの読み込みを、'wb'ならバイナリファイルへの書き込みを意味する。バイナリファイルの内容はbytes型のデータとしてやりとりをする。
バイナリファイルの読み込みを行うメソッドには以下がある。
バイナリファイルへの書き込みを行うメソッドには以下がある。
読み込んだデータはbytes型(またはbytearray型)のオブジェクトなので、それらを使用する際には何らかの型のデータへと変換する必要がある。例えば、文字列ならdecodeメソッドでそれらを文字列にデコードできる。逆に書き込みを行う際には、元のデータをbytes型のデータに変換する必要もある。例えば、文字列であれば、encodeメソッドでbytes型のデータに変換できる。整数ならto_bytesメソッド、from_bytesメソッドでbytes型の値との変換が行える。
以下にバイナリファイルの読み書きの例を示す。
with open('foo.bin', 'wb') as file:
mystr = 'Hello Python'
size = file.write(mystr.encode()) # 文字列をエンコードして書き込み
mynumbers = [x.to_bytes(2, 'little') for x in [0, 1, 2]] # bytes型に変換
for item in mynumbers:
file.write(item) # bytes型に変換された整数値を書き込み
file = open('foo.bin', 'rb')
tmp = file.read(size)
print(tmp.decode())
tmp = file.read(2) # 2バイトを読み込み
while tmp:
print(int.from_bytes(tmp, 'little'))
tmp = file.read(2)
file.close()
ここではファイルをバイナリ書き込みモードでオープンした後、文字列'Hello Python'をencodeメソッドでエンコードしたものをwriteメソッドで書き込んでいる。次に、リスト[0, 1, 2]の各要素をint型のto_bytesメソッドでbytesオブジェクトに変換し、それらをやはりwriteメソッドで書き込んでいる。
to_bytesメソッドを呼び出す際には第1引数にbytesオブジェクトに変換後のbytesオブジェクトのバイトサイズを(ここでは2バイトのデータに変換)、第2引数にバイトオーダー(bytesオブジェクトに変換された整数の各バイトの並び順)を指定する。ここでは'little'(リトルエンディアンと呼ばれるバイトオーダー)を指定している。書き込んだデータを読み込んで復元する際にはバイトオーダーが一致している必要がある点には注意が必要だ。
バイナリファイルからの読み込みでは、文字列の書き込み時に得たwriteメソッドの戻り値(書き込んだバイト数)を使って、バイナリファイルから文字列に相当するバイトデータを読み込み、それをdecodeメソッドで復元している。その後は、while文を使って2バイトずつ読み込んで、今度はint型のfrom_bytesクラスメソッドを使って、読み込んだバイトデータを整数に変換している。
Copyright© Digital Advantage Corp. All Rights Reserved.