为什么Python看不到文件中的所有行?

为什么Python看不到文件中的所有行?,python,input,line-breaks,Python,Input,Line Breaks,我使用Python按以下方法计算文件中的行数: n = 0 for line in file('input.txt'): n += 1 print n 我在Windows下运行此脚本 然后,我使用Unix命令计算同一文件中的行数: wc -l input.txt 使用Unix命令计数时,行数会显著增加 所以,我的问题是:为什么Python看不到文件中的所有行?或者这是一个定义问题?您的文件很可能包含一个或多个DOS EOF(CTRL-Z)字符,即ASCII码点0x1A。当Windows

我使用Python按以下方法计算文件中的行数:

n = 0
for line in file('input.txt'):
   n += 1
print n
我在Windows下运行此脚本

然后,我使用Unix命令计算同一文件中的行数:

wc -l input.txt
使用Unix命令计数时,行数会显著增加


所以,我的问题是:为什么Python看不到文件中的所有行?或者这是一个定义问题?

您的文件很可能包含一个或多个DOS EOF(CTRL-Z)字符,即ASCII码点0x1A。当Windows以文本模式打开一个文件时,它仍将遵守旧的DOS语义,并在读取该字符时结束文件。看

只有以二进制模式打开文件,才能绕过此行为。要执行此操作并仍然计算行数,您有两个选项:

  • 读入块,然后计算每个块中的行分隔符数:

    def bufcount(filename, linesep=os.linesep, buf_size=2 ** 15):
        lines = 0
        with open(filename, 'rb') as f:
            last = ''
            for buf in iter(f.read, ''):
                lines += buf.count(linesep)
                if last and last + buf[0] == linesep:
                    # count line separators straddling a boundary
                    lines += 1
                if len(linesep) > 1:
                    last = buf[-1]
        return lines
    
    考虑到在Windows操作系统上,linesep设置为
    \r\n
    ,请根据您的文件需要进行调整;在二进制模式下,行分隔符不会转换为
    \n

  • 使用;
    io
    文件对象集始终以二进制模式打开文件,然后自己进行翻译:

    import io
    
    with io.open(filename) as f:
        lines = sum(1 for line in f)
    

您的文件可能包含EOF标记?窗户上的那些真的很痛。看奇怪的。。。以前从未见过。你能验证哪个是正确的吗?Python还是unix命令?注意不要使用大写字母L,即
wc-L
,它给出的是最长行的长度,而不是行数(如果行数明显较大,这可能有意义)
wc
似乎是正确的(如果我根据文件大小判断)。我用小l。所以,它实际上是行数。