7

for line in file行末が必要な文字列になるように再定義されるPythonで行う方法が欲しいです。別の言い方をすれば、行ではなくファイルからレコードを読み取りたいということです。行を読むのと同じくらい速くて便利にしたい.

これは、Python で perl の$/入力レコード セパレータを設定したりScanner、Java で使用したりするのと同等です。これは必ずしも使用する必要はありませんfor line in file(特に、反復子はファイル オブジェクトではない場合があります)。あまりにも多くのデータをメモリに読み込むことを避けるための同等のもの。

参照: 標準 IO スタックに、任意のセパレーターを使用してレコードを読み取るためのサポートを追加する

4

2 に答える 2

11

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 区切り文字を見つけたい場合はそうではありません…)

于 2013-10-25T22:48:04.877 に答える