我在下面的方法中使用Python计算文件中的行数(行数):
n = 0
for line in file('input.txt'):
n += 1
print n
我在Windows下运行此脚本。
然后我使用Unix命令计算同一文件中的行数:
wc -l input.txt
使用Unix命令计数会显着增加行数。
所以,我的问题是:为什么Python没有看到文件中的所有行?或者这是一个定义问题?
答案 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)