我正在尝试读取二进制文件,结果令人困惑。
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'肯定在那里。
答案 0 :(得分:7)
可能在Windows 和上有一个Ctrl-Z(CP / M文件结束标记,由Windows通过MS-DOS继承)。这样做:
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)
。
答案 1 :(得分:-1)
data
是str
对象,因此len(data)
会告诉您此字符串的长度,而不是文件长度(以字节为单位)。