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

时间:2016-04-19 19:14:52

标签: 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没有看到文件中的所有行?或者这是一个定义问题?

1 个答案:

答案 0 :(得分:1)

你很可能有一个文件中包含一个或多个DOS EOF(CTRL-Z)字符,ASCII码点0x1A。当Windows以文本模式打开文件时,只要它读取该字符,它仍然会尊重旧的DOS语义并且结束文件。请参阅Line reading chokes on 0x1A

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

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

    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 os.linesep设置为\r\n,根据您的文件需要进行调整;在二进制模式下,行分隔符不会转换为\n

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

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