2013-04-28 12 views
11

区切り線を使用して区切られたファイルがあります(.)。私はこのファイルを改行の代わりに.の存在に基づいていなければならないという行ごとに読んでみたい。改行の区切り文字を指定してファイルを読む

f = open('file','r') 
for line in f.read().strip().split('.'): 
    #....do some work 
f.close() 

しかし、私のファイルが大きすぎる場合、これは、メモリ効率的ではありません。

一つの方法です。ファイル全体を読むのではなく、1行ずつ読む必要があります。

openは、パラメータ 'newline'をサポートしていますが、このパラメータは前述のhereのように入力としてNone, '', '\n', '\r', and '\r\n'しか使用しません。

ファイルを効率よく読み込む方法はありますか?あらかじめ指定された区切り文字に基づいていますか?

答えて

17

あなたは発電機を使用することができます。

def myreadlines(f, newline): 
    buf = "" 
    while True: 
    while newline in buf: 
     pos = buf.index(newline) 
     yield buf[:pos] 
     buf = buf[pos + len(newline):] 
    chunk = f.read(4096) 
    if not chunk: 
     yield buf 
     break 
    buf += chunk 

with open('file') as f: 
    for line in myreadlines(f, "."): 
    print line 
+0

名言@NPE!シンプルで、魅力的に機能します。 –

+0

外部ループの開始を 'iter(functools.partial(f.read、4096)、 ''):buf + = chunk'のチャンクに変更し、' if buf:yield buf'を追加することで、ループの後(内側ではない)。 – Harvey

2

最も簡単な方法は、あなたが望む改行を生成するための前処理には、ファイルになります。

ここで(あなたが文字列「ABC」を改行になりたいと仮定して)Perlを使用した例です:

perl -pe 's/abc/\n/g' text.txt > processed_text.txt 

あなたはまた、元の改行を無視したい場合は、代わりに次のようにします。

perl -ne 's/\n//; s/abc/\n/g; print' text.txt > processed_text.txt 
関連する問題