2016-07-24 18 views
0

我需要逐行處理Python中的大文件(大約1GB)。 我用這種方式來做到這一點:迭代號碼逐行處理大文件

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

什麼是「進程」功能? –

+1

包含你的文件混合行尾('\ n','\ r','\ n \ r')? – Daniel

+0

你能使用一個實用程序,比如'wc'來獲得另一個行數嗎?順便說一下,你可以使用'enumerate'(它會自動爲你提供索引值)壓縮你的for-loop,對於我來說,在枚舉(f)中是fline:' - 參見http://stackoverflow.com/questions/522563 /訪問最索引功能於蟒-for循環。最後,當讀取文件時,'r'是可選的 – Levon

回答

0

我可以想到兩種可能性。

  1. 您在使用Windows 2.x中,該文件包含約3倍之多 '\ r' 作爲公認的 '\ r \ n' 或 '\ n' 行結束,並EmEditor中承認 '\ r'作爲行結尾,就像Python 3.x一樣。或者在另一個操作系統上發生類似的事情。

說明:以文本模式打開文件。 3.x使用與操作系統無關的通用換行符,'\ r'和'\ r \ n'被轉換爲'\ n'。 2.x使用與操作系統相關的讀取,在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':打印(fline)「。

  1. Python在文件中有一些東西被認爲是文件結束,而EmEditor卻沒有。診斷。在循環前添加'length = 0',在循環中添加'length + = len(fline)',看看它是否至少大約在之後。
0

這些數字不匹配,因爲open函數使用的編碼對此文件不正確,請嘗試使用「ISO-8859-1」編碼。