ファイル入出力seek関数
write() バイナリファイルの書込み
write()呼び出しのモード文字列に'b'を追加すると、ファイルはバイナリモード
で開かれる。文字列ではなく、bytesを扱う
bdata = bytes(range(0, 256))
len(bdata)
256
fout = open('bfile', 'wb')
fout.write(bdata)
255
fout.close()
withで自動クローズ
with open('relativity', 'wt') as fout
fout.write(open)
これで正常に終わるか例外生成によって終わると、ファイルは自動的に
閉じる
seek() 位置の変更
Pythonは、ファイルの読み書き中にファイル内のどこにいるかを管理
している。tell()関数は、現在のファイルの先頭からのオフセットを
先頭からのオフセットをバイト単位で返す。seek()関数は、ファイル内
の別のオフセットに移動する。つまり、ファイルの最後のバイトを読み出す
ためにファイルをすべて読み出す必要はない。最後のバイトにseek()して
1バイトを読み出せばいい。
fin = open('bfile', 'rb')
fin.tell()
0
seek()を使ってファイルの末尾の1バイト手前に移動する
fin.seek(255)
255
そして、ファイルの末尾まで読み出す。
bdata = fin.read()
len(bdata)
1
bdata[0]
255
seek()は、移動後のオフセットも返してくる
seek()には、seek( offset, origin)のように第二引数に指定することも
できる。
○originが0(デフォルト)なら、先頭からoffsetバイトの位置に移動
○originが1なら、現在の位置からoffsetバイトの位置に移動
○originが2なら、末尾からoffsetバイトの位置に移動する。
標準のosモジュールでも定義されている
import os
os.SEEK_SET
0
os.SEEK_CUR
1
os.SEEK_END
2
最後のバイトの読み出だしは
fin = open('bfile', 'rb')
fin.seek(-1, 2)
255
fin.tell()
255
末尾まで読み出す
bdata = fin.read()
len(bdata)
1
bdata[0]
255
これらの関数がもっとも役にたつのはバイナリファイルだ
テキストファイルではテキストエンコーディングによって異なり
UTF-8では、1文字あたりのバイト数は可変になる。