当前位置:  开发笔记 > 编程语言 > 正文

线读取阻塞在0x1A上

如何解决《线读取阻塞在0x1A上》经验,为你挑选了2个好方法。

我有以下文件:

abcde
kwakwa
<0x1A>
line3
linllll

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

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

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

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



1> Ned Batcheld..:

0x1A是Ctrl-Z,DOS历史上将其用作文件结束标记.例如,尝试使用命令提示符,并"键入"您的文件.它只会在Ctrl-Z上显示内容.

Python使用Windows CRT函数_wfopen,它实现了"Ctrl-Z is EOF"语义.



2> Mark Ransom..:

内德当然是对的.

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有