我有以下文件:

abcde
kwakwa
<0x1A>
line3
linllll

其中<0x1A>表示十六进制值为0x1A的字节。尝试在Python中读取此文件时:

for line in open('t.txt'):
    print line,

它只读取前两行,然后退出循环。

解决方案似乎是以二进制(或通用换行模式)打开文件 - 'rb'或'rU'。你能解释一下这种行为吗?

有帮助吗?

解决方案

0x1A是Ctrl-Z,并且DOS历史上将其用作文件结束标记。例如,尝试使用命令提示符,并使用<!>“;键入<!>来表示您的文件。它只会在Ctrl-Z上显示内容。

Python使用Windows CRT函数_wfopen,它实现<!>“; Ctrl-Z是EOF <!>”;语义。

其他提示

Ned 当然是正确的。

如果你的好奇心稍微深一点,那么根本原因就是向后兼容性极端。 Windows与DOS兼容,后者使用Ctrl-Z作为文本文件的可选文件结束标记。您可能不知道的是DOS与CP / M兼容,CP / M在PC之前的小型计算机上很流行。 CP / M的文件系统没有跟踪文件大小到字节级别,它只跟踪软盘扇区的数量。如果您的文件不是128字节的精确倍数,则需要一种方法来标记文本的结尾。 这篇维基百科文章暗示了Ctrl-Z的选择基于一个更老的惯例分解

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top