线读取扼流圈0x1A的

问题描述:

我有以下文件:线读取扼流圈0x1A的

abcde 
kwakwa 
<0x1A> 
line3 
linllll 

其中<0x1A>代表与0x1A的的十六进制值一个字节。当试图在Python中读取此文件时:

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

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

的解决方案似乎是打开二进制文件(或通用换行模式)的文件 - “RB”或“儒的。你能解释这种行为吗?

+0

你怎么知道这个字节代表。对我来说,它只是在记事本中说'SUB'++ – Programmer 2012-08-23 06:13:28

+0

另一个解决方法是使用Python 3或[`io.open()`](https://docs.python.org/2/library/io.html #io.open)在Python 2中;就操作系统而言,`io`文件对象总是以二进制模式使用文件,所以Windows不会过早地“结束”文件。 – 2016-04-19 21:24:32

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使用的更老的约定。