在Python

时间:2015-07-09 13:27:38

标签: 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

但是如果有一个长文件,其中包含635474行,那么上面发布的两种方法的输出都是635466

我知道该文件有635474行,而不是635466行,因为我在文件中创建了字符串,最后两行是:

alm_asdf_alarm635473=.NOT USED
alm_asdf_alarm635474=.NOT USED

另外因为如果我用Notepad++打开文件,最后一行会被计为635474

这背后的逻辑是什么?为什么计算真实线条的线数较少?

提前致谢。

1 个答案:

答案 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))):