如何获取支持seek的类bytearray对象,实现文件与缓冲区统一读取?
问题解答
1. 支持seek()的类bytearray对象
Python没有原生自带支持seek()方法的bytearray子类,但可以用io.BytesIO来实现需求:它是基于内存的二进制流对象,既具备bytearray的缓冲区功能,又完全兼容文件类操作接口(包括seek()、read()、tell()等)。
示例代码:
import io # 从bytearray创建BytesIO对象 buf = io.BytesIO(bytearray(10)) buf.seek(1) # 正常执行,不会报错 print(buf.tell()) # 输出 1
2. 适配二进制文件与缓冲区的统一读取方案
用io.BytesIO做统一适配层,就能让同一套代码同时兼容已打开的二进制文件对象和类bytearray缓冲区:
统一实现思路
- 对于已打开的二进制文件
fid:直接使用该对象(本身就是类文件对象,支持seek()和numpy.fromfile的逻辑) - 对于bytearray/bytes缓冲区:将其包装为
BytesIO对象,使其具备类文件操作接口
合并后的示例代码
import numpy as np import io def read_data(source, dtype=np.float32, count=10): # 统一将输入转换为类文件对象 if isinstance(source, (bytes, bytearray)): source = io.BytesIO(source) # 统一用fromfile读取,offset行为和文件读取保持一致(基于当前指针位置) data = np.fromfile(source, dtype=dtype, count=count) return data # 测试:读取二进制文件 with open("data.bin", "rb") as fid: fid.seek(101) # 移动到指定位置 file_data = read_data(fid) # 测试:读取bytearray缓冲区 buf = bytearray(100) # 写入测试数据 test_arr = np.array([1.0, 2.0, 3.0], dtype=np.float32) buf[20:20+test_arr.nbytes] = test_arr.tobytes() # 先移动指针再读取 buf_io = io.BytesIO(buf) buf_io.seek(20) buf_data = read_data(buf_io)
逻辑说明
BytesIO包装后的缓冲区对象,和二进制文件对象的行为完全对齐:支持seek()调整指针位置,numpy.fromfile读取时的offset参数也会基于当前指针位置生效,这样就无需区分fromfile和frombuffer,用同一套逻辑就能处理两种输入。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

