問題

私は、行の終わりが私が望む任意の文字列であるように再定義されているPythonでfor line in fileを行う方法が欲しいです。もう一つの言い方は、行ではなくファイルからレコードを読みたいということです。私はそれが行を読むのと同じくらい速く便利であることを望みます。

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

また、 標準の IO スタック に任意のセパレータを持つレコードの読み込みサポートを追加する

  ベストアンサー

Python 2.x fileオブジェクト、またはPython 3.3 ioクラスには何もありません。これにより、readlineのカスタム区切り文字を指定できます。 (for line in fileは最終的にreadlineと同じコードを使用しています)。

しかし、それを自分で構築するのはかなり簡単です。例えば:

 def delimited(file, delimiter='
', 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の両方で正しく取得したい場合は、少しトリッキーです。しかし、それが1つまたは他の言語(および1つの言語または他の言語)でしか動作しない場合は、それを無視することができます。

同様に、Python 3.x(またはPython 2.xでioオブジェクトを使用している場合)を使用していて、バッファの上にバッファを置くのではなく、BufferedIOBaseで既に維持されているバッファを使用したい場合は、それはトリッキーです。 io docsはすべてのことを行う方法を説明しています...しかし、私は単純な例を知らないので、実際にはそのページの少なくとも半分を読み込んで残りをスキムする必要があります(もちろん、生のファイル

  同じタグがついた質問を見る

pythonfileiorecordseparator