2016-07-24 12 views
0

大きなファイルをPythonで処理する必要があります(約1GB)。 は、私はそれを行うには、このアプローチを使用します。大きいファイルを1行ずつ処理する反復回数

with open('file.txt', 'r') as f: 
    i = 0 
    for fline in f: 
     process(fline) 
     i = i + 1 
print i 

iの値(反復数=ファイルの行数)は19991889です。

ファイル(EmEditorで開く)は、ファイルに63,941,070行があることを報告します。

なぜ行数が一致しないのですか?私は間違っているの?

ありがとうございました。

+0

'process'関数とは何ですか? –

+1

にはファイル混在行末( '\ n'、' \ r'、 '\ n \ r')が含まれていますか? – Daniel

+0

別の行数を取得するために 'wc'のようなユーティリティを使用できますか?ちなみに、あなたは 'enumerate'を使ってforループを圧縮することができます(これは自動的にインデックス値を与えます)' for i、enumerate(f)でfline: ' - http://stackoverflow.com/questionsも参照してください/ 522563/index-in-python-for-loopsにアクセスしてください。最後に '' r''はファイルを読むときにオプションです。 – Levon

答えて

0

私は2つの可能性を考えることができます。

  1. あなたがWindows上で2.xのを実行している認識として、ファイルを約3倍など、多くの '\ rを' 文字が含まれている '\ rを\ nは' または '\ n' の行末、およびEmEditorのは '\ r' を認識し、 Python 3.xと同様に行末として使用されます。または、2.7で別のOSで同様のことが起きています。

説明:テキストモードでファイルを開きます。 3.xはOSに依存しないユニバーサル改行が使用され、 '\ r'と '\ r \ n'は '\ n'に変換されます。 2.xはOS依存の読み込みを使用し、Windowsでは '\ r \ n'のみが使用されます。

例:

with open('tem.dat', 'wb') as f: 
    f.write(b'a\rb\r\nc\n\rd\n') 
with open('tem.dat', 'r') as f: 
    for i, t in enumerate(f): 
     print(i, t, repr(t[-1])) 

3.xのプリント

0 a 
'\n' 
1 b 
'\n' 
2 c 
'\n' 
3 
'\n' 
4 d 
'\n' 

2.xのプリント

(0, 'a\rb\n', "'\\n'") 
(1, 'c\n', "'\\n'") 
(2, '\rd\n', "'\\n'") 

診断:flineとの「あなたのコードにある場合は '\ r' を追加します。印刷前に印刷してください。

  1. ファイル内にPythonがEnd-of-Fileと見なすものがあり、EmEditorには何かがありません。診断。ループの前に 'length = 0'を追加し、ループの中で 'length + = len(fline)'を追加して、少なくともほぼ直後であるかどうかを確認します。
0

open関数が使用するエンコーディングがこのファイルでは正しくないため、番号が一致しないため、「ISO-8859-1」エンコーディングを使用してください。

関連する問題