Python 2.xfile
オブジェクトまたは Python 3.3io
クラスには、 のカスタム区切り文字を指定できるものはありませんreadline
。(for line in file
は最終的に と同じコードを使用していreadline
ます。)
しかし、それを自分で構築するのは非常に簡単です。例えば:
def delimited(file, delimiter='\n', bufsize=4096):
buf = ''
while True:
newbuf = file.read(bufsize)
if not newbuf:
yield buf
return
buf += newbuf
lines = buf.split(delimiter)
for line in lines[:-1]:
yield line
buf = lines[-1]
これが実際の愚かな例です:
>>> s = io.StringIO('abcZZZdefZZZghiZZZjklZZZmnoZZZpqr')
>>> d = delimited(s, 'ZZZ', bufsize=2)
>>> list(d)
['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr']
特に 3.x では、バイナリ ファイルとテキスト ファイルの両方を正しく処理したい場合は、少し注意が必要です。ただし、どちらか一方 (およびどちらか一方の言語) でのみ機能する必要がある場合は、それを無視できます。
同様に、Python 3.x を使用している場合 (またはPython 2.x のオブジェクトを使用している場合) で、バッファーの上にバッファーを配置するのではなく、io
既に保持されているバッファーを利用したい場合は、BufferedIOBase
よりトリッキー。ドキュメントはio
すべてを行う方法を説明しています... しかし、私は簡単な例を知りません. (もちろん、生のファイルを直接使用することもできますが、Unicode 区切り文字を見つけたい場合はそうではありません…)