Python在使用read时停止读取文件

3 投票
2 回答
4165 浏览
提问于 2025-04-17 08:01

我正在尝试读取一个二进制文件,但结果让我感到困惑。

f = open('foo.dat','r')

data = f.read()

print len(data), f.tell()

输出是:

61, 600

这是怎么回事?我只读取了前61个字节,但文件对象却告诉我已经到达文件末尾(这个文件总共有600个字节)。剩下的字节去哪了?

我刚在Matlab中尝试读取这个文件,结果读取得很好,所以我很确定数据文件是没问题的。

文档中提到了一些关于“阻塞”的内容:“请注意,在非阻塞模式下,返回的数据可能少于请求的数据量,即使没有给出大小参数。”我是在非阻塞模式吗?看起来这对文件来说不应该有影响。我该如何切换到阻塞模式呢?

更新
@John Machin - 没错!谢谢你!看起来这确实是发生的情况。以下是输出:

600, 600
'm\x1aN\x16\x8d\x1e\x96\x10h\x1a'

里面确实有'\x1a'。

2 个回答

-1

data 是一个字符串对象,所以 len(data) 告诉你这个字符串的长度,而不是文件的字节长度。

7

这可能是在Windows系统上,并且你有一个Ctrl-Z(这是CP/M的文件结束标记,后来通过MS-DOS被Windows继承了)。你可以这样做:

f = open('foo.dat','rb') # NOTE b for binary
data = f.read() 
print len(data), f.tell() 
print repr(data[60:70])

然后把结果给我们看看。Ctrl-Z的表示是'\x1a',也就是chr(26)

撰写回答