您很可能有一个包含一个或多个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
您很可能有一个包含一个或多个DOS EOF(CTRL-Z)字符的文件,ASCII码位0x1A。当Windows以文本模式打开文件时,它仍将遵循旧的DOS语义,并在每次读取该字符时都将执行文件。见Line reading chokes on 0x1A。你知道吗
只有以二进制模式打开文件,才能绕过这种行为。若要执行此操作并仍计算行数,您有两个选项:
读入块,然后计算每个块中的行分隔符数:
考虑到在Windows上
os.linesep
设置为\r\n
,根据需要调整文件;在二进制模式下,行分隔符不会转换为\n
。使用^{} ;
io
文件对象集总是以二进制模式打开文件,然后自己进行翻译:相关问题 更多 >
编程相关推荐