python 读取二进制数据到可变缓冲区中
2023-09-14 09:07:33 时间
想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。
为了读取数据到一个可变数组中,使用文件对象的readinto() 方法。比如
import os.path def read_into_buffer(filename): buf = bytearray(os.path.getsize(filename)) with open(filename, 'rb') as f: f.readinto(buf) return buf
下面是一个演示这个函数使用方法的例子:
>>> with open('sample.bin', 'wb') as f: ... f.write(b'Hello World') ... >>> buf = read_into_buffer('sample.bin') >>> buf bytearray(b'Hello World') >>> buf[0:5] = b'Hallo' >>> buf bytearray(b'Hallo World') >>> with open('newsample.bin', 'wb') as f: ... f.write(buf) ... 11 >>>
文件对象的readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由array 模块或numpy 库创建的数组。和普通read() 方法不同的是, readinto() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们。因此,你可以使用它来避免大量的内存分配操作。比如,如果你读取一个由相同大小的记录组成的二进制文件时,你可以像下面这样写:
record_size = 32 # Size of each record (adjust value) buf = bytearray(record_size) with open('somefile', 'rb') as f: while True: n = f.readinto(buf) if n < record_size: break # Use the contents of buf
另外有一个有趣特性就是memoryview ,它可以通过零复制的方式对已存在的缓冲区执行切片操作,甚至还能修改它的内容。比如:
>>> buf bytearray(b'Hello World') >>> m1 = memoryview(buf) >>> m2 = m1[-5:] >>> m2 <memory at 0x100681390> >>> m2[:] = b'WORLD' >>> buf bytearray(b'Hello WORLD') >>>
使用f.readinto() 时需要注意的是,你必须检查它的返回值,也就是实际读取的字节数。如果字节数小于缓冲区大小,表明数据被截断或者被破坏了(比如你期望每次读取指定数量的字节)。最后,留心观察其他函数库和模块中和into 相关的函数(比如recv into() ,pack into() 等)。Python 的很多其他部分已经能支持直接的I/O 或数据访问操作,这些操作可被用来填充或修改数组和缓冲区内容。
相关文章
- Python快速学习06:词典
- 朴素贝叶斯算法的python实现方法
- Python命名规范
- python后端面试第三部分:数据储存与缓存相关--长期维护
- 【python cookbook】【数据结构与算法】14.对不原生支持比较操作的对象排序
- Python 触“类”旁通3|单链表基本操作之找查、删除和反转
- 【OpenCV-Python】教程:4-4 SIFT (Scale-Invariant Feature Transform) 介绍
- 华为OD机试 - 网上商城优惠活动(Java & JS & Python)
- 成功解决pythonopsseq2seq.py TypeError: ms_error() got an unexpected keyword argument 'logits'
- 学习 Python 编程的 11 个受用终身的技巧
- python采集天气数据 并做数据可视化 (含完整源代码)
- 外卖必不可少,咋确定好不好吃呢~ python采集数据信息
- python将内存映射为磁盘并从内存中将数据复制到磁盘
- Python批量检测服务器端口可用性与Socket函数使用
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
- 太爱了!一款基于智能推荐的Python数据探索(EDA)工具来了!
- 【阶段三】Python机器学习27篇:机器学习项目实战:数据降维:主成分分析PCA、基本原理与PCA模型:人脸识别
- 【阶段二】Python数据分析数据可视化工具使用02篇:条形图与雷达图
- 【华为机试真题 Python实现】圆桌队列【2022 Q2 | 200分】
- Python编程:Pandas合并数据merge
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
- 用Python做数据分析之数据处理及数据提取
- 5. Python大法之告别脚本小子--各类URL采集器编写
- python多进程map用户 scatter绘图 make_blobs聚类数据生成
- python cassandra 创建space table并写入和查询数据
- python-opencv之人脸检测
- python工具方法 3 numpy多维数组清洗,删除任意维度的数组,仅保留感兴趣的一维数据
- 解决Python中文注释报错
- Python接口自动化——Web接口(2-2)