11

私は通常、Pythonで次のようなファイルを読み取ります。

f = open('filename.txt', 'r')
for x in f:
    doStuff(x)
f.close()

ただし、これによりファイルが改行で分割されます。これで、すべての情報が1行に含まれるファイルができました(45,000文字列がコンマで区切られています)。このサイズのファイルは、次のようなものを使用して読み込むのは簡単ですが

f = open('filename.txt', 'r')
doStuff(f.read())
f.close()

すべてが1行になっているはるかに大きなファイルの場合、最初のコードスニペットと同様の反復効果を実現できるかどうか知りたいのですが、改行の代わりにコンマで分割するか、他の文字で分割しますか?

4

2 に答える 2

9

次の関数は、必要なことを行うためのかなり簡単な方法です。

def file_split(f, delim=',', bufsize=1024):
    prev = ''
    while True:
        s = f.read(bufsize)
        if not s:
            break
        split = s.split(delim)
        if len(split) > 1:
            yield prev + split[0]
            prev = split[-1]
            for x in split[1:-1]:
                yield x
        else:
            prev += s
    if prev:
        yield prev

次のように使用します。

for item in file_split(open('filename.txt')):
    doStuff(item)

これは、EMS がリンクしたソリューションよりも高速であり、大きなファイルのファイル全体を一度に読み取るよりも多くのメモリを節約できます。

于 2012-04-17T01:37:01.597 に答える
1

を使用してファイルを開き、メソッドをopen()使用してファイルから次のバイトをfile.read(x)(おおよそ)読み取ります。xファイルの終わりに到達するまで、4096文字のブロックを要求し続けることができます。

分割は自分で実装する必要がありcsvます。モジュールからインスピレーションを得ることができますが、非常に長い行を処理するように設計されていないため、直接使用できるとは思いません。

于 2012-04-17T01:13:53.870 に答える