我有以下文件:
abcde kwakwa <0x1A> line3 linllll
其中<0x1A>
表示hex值为0x1A的字节。 当试图在Python中读取这个文件时:
for line in open('t.txt'): print line,
它只读取前两行,并退出循环。
解决scheme似乎是以二进制(或通用换行模式)打开文件 – 'rb'或'rU'。 你能解释这种行为吗?
0x1A是Ctrl-Z,历史上DOS使用它作为文件结束标记。 例如,尝试使用命令提示符,然后“键入”文件。 它只会在Ctrl-Z上显示内容。
Python使用Windows CRT函数_wfopen,它实现了“Ctrl-Z is EOF”语义。
奈德当然是对的。
如果你的好奇心走得更深一些,那么根本原因就是向后兼容性被拿到了极点。 Windows与DOS兼容,它使用Ctrl-Z作为文本文件标记的可选结束符。 你可能不知道的是DOS与PC / PC之前在小型计算机上流行的CP / M兼容。 CP / M的文件系统没有跟踪文件大小到字节级别,只跟踪软盘扇区的数量。 如果您的文件不是128字节的确切倍数,则需要一种标记文本结尾的方法。 这篇维基百科文章暗示,Ctrl-Z的选择是基于DEC使用的更古老的约定。