我一直在尝试计算一个很长文件的行(超过635000
行)。
我试过了:
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
还有:
num_lines = sum(1 for line in open(fname))
对于没有那么多行的文件,两者都能很好地工作。我已经检查了5行文件并且工作正常,输出为5
。
但是如果有一个长文件,其中包含635474
行,那么上面发布的两种方法的输出都是635466
。
我知道该文件有635474
行,而不是635466
行,因为我在文件中创建了字符串,最后两行是:
alm_asdf_alarm635473=.NOT USED
alm_asdf_alarm635474=.NOT USED
另外因为如果我用Notepad++
打开文件,最后一行会被计为635474
。
这背后的逻辑是什么?为什么计算真实线条的线数较少?
提前致谢。
答案 0 :(得分:0)
如果你的所有行都有相同的结构,你可以尝试这样的程序:
import re
num = re.compile('[^0-9]*([0-9]+)')
delta = 1 # initial delta
with open(...) as fd:
for i, line in enumerate(fd, delta):
m = num.match(line)
if i != int(m.group(1)):
print i, "th line for number ", int(m.group(1))
break
找到你有差异的第一行应该足够了(对于第一行内部编号为1而不是0的情况,delta就在这里)。然后你可以用notepad ++更容易地理解问题的真正来源。
注意:如果只有一些行具有此结构,则可以使用该变体:
m = num.match(line)
if (m is not None) and (i != int(m.group(1))):