计算在Python中无法正常工作的长文件的行数

计算在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 但是对于一个长文件,它

我一直在计算一个很长文件的行数(超过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

这背后的逻辑是什么?为什么数的行数比真的少


提前感谢。

如果您的所有行都具有相同的结构,您可以尝试这样的程序:

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++
所述。