为什么Python看不到文件中的所有行?
我使用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
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语义,并在读取该字符时结束文件。看 只有以二进制模式打开文件,才能绕过此行为。要执行此操作并仍然计算行数,您有两个选项:
- 读入块,然后计算每个块中的行分隔符数:
考虑到在Windows操作系统上,linesep设置为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
,请根据您的文件需要进行调整;在二进制模式下,行分隔符不会转换为\r\n
\n
- 使用;
文件对象集始终以二进制模式打开文件,然后自己进行翻译:io
import io with io.open(filename) as f: lines = sum(1 for line in f)
wc-L
,它给出的是最长行的长度,而不是行数(如果行数明显较大,这可能有意义)wc
似乎是正确的(如果我根据文件大小判断)。我用小l。所以,它实际上是行数。