线读取扼流圈0x1A的
问题描述:
我有以下文件:线读取扼流圈0x1A的
abcde
kwakwa
<0x1A>
line3
linllll
其中<0x1A>
代表与0x1A的的十六进制值一个字节。当试图在Python中读取此文件时:
for line in open('t.txt'):
print line,
它只读取前两行,并退出循环。
的解决方案似乎是打开二进制文件(或通用换行模式)的文件 - “RB”或“儒的。你能解释这种行为吗?
答
0x1A是Ctrl-Z,历史上DOS使用它作为文件结束标记。例如,尝试使用命令提示符,然后“键入”文件。它只会在Ctrl-Z上显示内容。
Python使用视窗CRT功能_wfopen,它实现了 “CTRL-Z是EOF” 语义。
答
Ned当然是正确的。
如果你的好奇心运行得更深一点,根本原因是向后兼容性被采取到极致。 Windows与DOS兼容,它使用Ctrl-Z作为文本文件的文件标记的可选结尾。你可能不知道的是DOS与PC/PC之前在小型计算机上流行的CP/M兼容。 CP/M的文件系统没有跟踪文件大小,直到字节级别,它只跟踪软盘扇区的数量。如果您的文件不是128字节的精确倍数,则需要一种标记文本结尾的方法。 This Wikipedia article意味着Ctrl-Z的选择基于DEC使用的更老的约定。
你怎么知道这个字节代表。对我来说,它只是在记事本中说'SUB'++ – Programmer 2012-08-23 06:13:28
另一个解决方法是使用Python 3或[`io.open()`](https://docs.python.org/2/library/io.html #io.open)在Python 2中;就操作系统而言,`io`文件对象总是以二进制模式使用文件,所以Windows不会过早地“结束”文件。 – 2016-04-19 21:24:32