2016-07-24 48 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”编码。