计算在Python中无法正常工作的长文件的行数
我一直在计算一个很长文件的行数(超过635000行) 我试过:计算在Python中无法正常工作的长文件的行数,python,python-2.7,Python,Python 2.7,我一直在计算一个很长文件的行数(超过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 但是对于一个长文件,它
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
这背后的逻辑是什么?为什么数的行数比真的少
提前感谢。如果您的所有行都具有相同的结构,您可以尝试这样的程序:
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
找到有差异的第一行就足够了(这里的delta用于第一行内部编号为1而不是0的情况)。然后,使用记事本++您就可以更容易地理解问题的真正根源
注意:如果只有一些行具有此结构,则可以使用该变体:
m = num.match(line)
if (m is not None) and (i != int(m.group(1))):
您确定在所有行中使用相同的行分隔符吗?是。当我为每行创建字符串时,我会在末尾添加一个
\n
。这意味着,对于每一行:f\u out.write(“stuff\n”)
。我一次写下所有内容。这告诉你什么?顺便问一下:你知道enumerate
接受start
关键字参数吗<代码>列表(枚举([1,2,3],开始=1))=[(1,1)、(2,2)、(3,3)]。我写了一个包含635474行的文件,但无法重现您的问题。行在=
之后有不同的内容。这意味着我可以有alm_asdf_alarm635473=。未使用,alm_asdf_alarm635472=。HELLO
,alm_asdf_alarm635471=.FOO BAR BAZ
,或=/code>之后的任何内容。所以我使用了你的第二个变体,但它不起作用。没有显示错误,但它从不进入if
@Borja:my regex应该忽略数字后面的所有内容。如果只有=
后面的部分不同,您应该尝试初始代码,以确保在代码中没有错误regex@Borja当前位置正则表达式中有一个拼写错误。您应该试试固定版本。现在可以了,谢谢,输出是635474
,正如Notepad++
所述。