从PYTHON

时间:2018-09-20 02:15:41

标签: python file binary seek

我想读取二进制文件的特定部分。我将实现一个二进制文件来“模拟”数组。

例如,假设所有对象的大小都相同(从字面上看是22个字节):

  • 插入索引为0的对象将占用文件的0-22字节。
  • 插入索引为1的对象将占用文件的22-44个字节。

因此,当我插入这两个对象时,我成功读取了第二个对象,但是在尝试读取第一个对象时出现错误。

进口

import pickle
from sys import getsizeof

插入第一个对象

with open("test2", "wb") as f:
buffer = pickle.dumps(10)
print(getsizeof(buffer))
f.write(buffer)
f.close

控制台:

  

22

所以我使用seek()在位置22中插入另一个数字

with open("test2", "wb") as f:
buffer = pickle.dumps(20)
f.seek(22,1)
print(getsizeof(buffer))
f.write(buffer)
f.close

控制台调整sabe大小

  

22

现在尝试读取第二个数字(数字20)

with open("test2", "rb") as f:
f.seek(22,1)
buffer = f.read()
print(getsizeof(buffer))
print(pickle.loads(buffer))
f.close

控制台日志成功显示该数字及其大小(以字节为单位)

  

22   20

但是现在,当尝试阅读第一个时:

with open("test2", "rb") as f:
buffer = f.read(22)
print(getsizeof(buffer))
print(pickle.loads(buffer))
f.close

控制台显示错误的请求字节大小

  

39

错误

  

发生了异常:_pickle.UnpicklingErrorload键'\ x00'。

我不知道它是否相关,但这就是读取的所有文件

  

b'\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x80 \ x03K \ x14。'

0 个答案:

没有答案