4

行ごとにストリーミングして、Python で入力テキスト ファイルを読み取る必要があります。つまり、テキスト ファイルを一度にメモリにロードするのではなく、1 行ずつロードします。しかし、私の行区切り文字は空白ではなく、任意の文字です。

行ごとにファイルをロードするための Stack Overflow のメソッドを次に示します。

with open("log.txt") as infile:
    for line in infile:
        do_something_with(line)

上記は完璧ですが、区切り文字を空白から別の文字に変更する必要があります。

これはどのように行うことができますか?ありがとうございました。

4

2 に答える 2

5
import re
def open_delimited(filename, delimiter, chunksize=1024, *args, **kwargs):
    with open(filename, *args, **kwargs) as infile:
        remainder = ''
        for chunk in iter(lambda: infile.read(chunksize), ''):
            pieces = re.split(delimiter, remainder+chunk)
            for piece in pieces[:-1]:
                yield piece
            remainder = pieces[-1]
        if remainder:
            yield remainder

for line in open_delimited("log.txt", delimiter='/'):
    print(repr(line))
于 2013-07-07T02:34:17.633 に答える
1

Python には、このためのネイティブ コンストラクトがありません。文字を一度に 1 つずつ読み取り、区切られた項目全体が得られるまで蓄積するジェネレーターを作成できます。

def items(infile, delim):
    item = []
    c = infile.read(1)
    while c:
        if c == delim:
            yield "".join(item)
            item = []
        else:
            c = infile.read(1)
            item.append(c)
    yield "".join(item)

with open("log.txt") as infile:
    for item in items(infile, ","):   # comma delimited
        do_something_with(item)

ファイルをチャンク (たとえば 64K 程度) で読み取り、これらを分割すると、パフォーマンスが向上します。ただし、アイテムが複数のチャンクに分割される可能性があるため、このロジックはより複雑です。そのため、100% 正しく理解できるとは限らないため、ここでは説明しません。:-)

于 2013-07-07T02:30:18.653 に答える