Python: 二进制字节流数据的读取操作 – bytes 与 bitstring

最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容。这要求有两个标志,一个开始,一个结束,获取中间的内容。

Python 的 bytes 内置了一些方法,但是却不完美。在调查后,了解到 bitstring 这个第三方包,在对字节流数据的处理上,似乎更合适。

bytes

bytes:一种字符序列的类型。通过比较 dir(str) 与 dir(bytes) 可知,两者的属性与方法很相似,只有少数几个不同。所以 bytes 也是可以像 string 一样,对字节序列有各种操作方法,如查找(find),求长度(len),切割(split),切片等。

bytes 的优点是:Python 内置的方法,不需要的额外的安装三方模块。

但缺点也很明显:只能单个查询,不能一次查询多个需要的结果。

首先通过 open 的 rb 模式打开文件,读取内容为 bytes 类型。查找特定字符串有 find() 方法,但是此方法只能找到第一个符合要求的字符串索引,并且给出的不是单个位的索引,而是 8 位一个字节的索引。当需要查找多个符合的字符串,却没有内置的 findall() 方法。如果要查询多个,过程会麻烦,首先查到第一个符合的索引 1,以此索引 1 为开始,查询第二个符合的索引 2,以此类推,直到查询结束。

with open(path, 'rb') as f:datas = f.read()start_char = datas.find(b'Start')# start_char2 = datas.find(b'Start', start_char)end_char = datas.find(b'End', start_char)# end_char2 = datas.find(b'End', start_char2)data = datas[start_char:end_char]print(data)

注意上述代码,start_char 和 end_char 会出现多次,次数并不一定会一样,需要获取两个索引之间的内容,但是既无法循环,也不能一次查完。需要多次执行已注释的那行代码,获取关键字索引。由于不知道文件数据中会有多少个开始标志,也就不知道执行多少次,这应该采用循环解决,但似乎没有可供循环的变量。这使得问题更加复杂。

其次,由于是获取两个标志之间的内容,所以,以上过程需要执行两遍。因此过程更显得繁杂无比。

因此,寻找新的方法,是完全必要的。

bitstring

bitstring 是一个三方包,以字节流形式读取二进制文件。

bitstring.py 文件的第一句话是:This package defines classes that simplify bit-wise creation, manipulation and interpretation of data.

翻译如下:这个包定义的类简化了数据的逐位创建、操作和解释。

简单理解就是,直接操作 bytes 类型的数据。

有主要的四个类,如下:

Bits -- An immutable container for binary data.
BitArray -- A mutable container for binary data.
ConstBitStream -- An immutable container with streaming methods.
BitStream -- A mutable container with streaming methods.Bits -- 二进制数据的不可变容器。
BitArray -- 二进制数据的可变容器。
ConstBitStream -- 具有流方法的不可变容器。
BitStream -- 具有流方法的可变容器。

像 bytes 一样,首先读取文件内容,查找关键字索引,切片获取数据内容。

# update at 2022/05/06 start
# from bistring import ConstBitStream, BitStream
from bitstring import ConstBitStream, BitStream
# update at 2022/05/06 endhex_datas = ConstBitStream(filename=path)  # 读取文件内容
start_char = b'Start'
start_chars = hex_datas.findall(start_char, bytealigned=True)  # 一次找到全部符合的,返回一个生成器
start_indexs = []
for start_char in start_chars:start_indexs.append(start_char)end_char = b'End'
end_indexs = []
for start_index in start_indexs:end_chars = hex_datas.find(end_char, start=start_index, bytealigned=True)  # 找到第一个符合的,返回元组for end_char in end_chars:end_indexs.append(end_char)result = []
for i in range(min(len(start_indexs), len(end_indexs))):hex_data = hex_datas[start_indexs[i]:end_indexs[i]]str_data = BitStream.tobytes(hex_data).decode('utf-8')result.append(str_data)

代码分析,首先导入需要的两个类:ConstBitStream, BitStream。获取文件内容,findall() 查找所有符合的字符串索引,find() 查找第一个符合的字符串索引。取开始、结束两个列表的较小值,切片获取数据,类型为 ‘bitstring.ConstBitStream’,BitStream.tobytes() 方法转为 bytes 类型,中文字符会乱码,所以再用 decode() 解码,得到需要的字符串。

整个过程还是简洁、连续。代码中用到了 findall()、find()、tobytes() 方法。此外还有许多小细节需要注意,比如,start_indexs 如果为空,后续的代码就不该执行了,end_indexs 为空亦是如此。

由此可见,bitstring 这个包还是比较好用的。根据需求,用到的方法比较少,其实还有许多其他的方法,按需选择。

Python: 二进制字节流数据的读取操作 -- bytes 与 bitstring相关推荐

  1. python对Excel数据进行读写操作

    python对Excel数据进行读写操作 将学习到的基础操作记录在这里,便与复习查看 1.python读取Excel工作簿.工作表 import xlrd # 读取工作簿 wb=xlrd.open_w ...

  2. python写入excel表格数据绘制图表_(原创)xlsxwriter,python excel 写入数据\图表等操作_图表操作(二)...

    前面分享了使用xlsxwriter创建excel和写入数据GUC:(原创)xlsxwriter,python excel 写入数据\图表等操作_创建.写入(一)​zhuanlan.zhihu.com ...

  3. python通信达数据_Python读取通达信数据

    Python读取通达信数据 一.介绍 python获取股票数据的方法很多,其中Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便. 日线数据存在这路径下 D:\通 ...

  4. python 通达信数据_Python读取通达信本地数据

    一.介绍 python获取股票数据的方法很多,其中 Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便. 日线数据存在这路径下 D:\通达信\vipdoc\sh\ ...

  5. 基于python的股票数据的读取及可视化(K线图)

    文章目录 1.读取数据 2.绘制股票走势图 3.绘制K线图 1.读取数据 TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程, ...

  6. python各种文件数据的读取

    (持续更新中-) 文章目录 (持续更新中...) 0 常规方法open 0.1 读取时存在中文无法识别 0.2 写入,写入中文 1.读取excel文件 一)python读取: 2.读取csv文件 一) ...

  7. 下列哪项不是python中对文件的读取操作-Python—文件读写操作

    初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...

  8. python获取redis数据_Python之操作redis数据库

    使用redis模块 一.操作redis 1.添加信息 (1)直接建key-value信息: 右键-Add New Key,手动添加key和value 右键-Console,打开控制台,写入命令 (2) ...

  9. python处理mat数据_python读取.mat文件的数据及实例代码

    首先导入scipy的包 from scipy.io import loadmat 然后读取 m = loadmat("F:/__identity/activity/论文/data/D001. ...

最新文章

  1. 设计模式学习笔记-中介模式
  2. 【PAT甲级 前导0,排序】1069 The Black Hole of Numbers (20 分) C++ 全部AC
  3. Codeforces Round #530 (Div. 2)
  4. CSS3秘笈复习:第一章第二章第三章
  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_4字符输出流的基本使用_写出单个字符...
  6. 《零基础作曲编曲完全教程》(合辑)崛起的卧室音乐人 编曲教程 作曲教程精进篇
  7. qt中添加注释的快捷键_Qt Creator快捷键
  8. 【零基础】MT4量化入门三:写一个双均线指标
  9. 串口协议模板及其参数配置
  10. python javascript人工智能_Python,Java和JavaScript哪个编程语言未来发展空间更大?...
  11. Ping 1000个包看丢跑率
  12. 关于新冠疫情,常用的英文单词、语句有哪些?
  13. python程序运行结果不停_关于python:在进程运行时不断打印Subprocess输出
  14. 【技巧 二进制分组】bzoj4398: 福慧双修2407: 探险
  15. SQL中单引号和双引号
  16. 晶晨方案Burn_Card_Maker工具v2.0.2
  17. 一文读懂,DDD落地数据库设计实战
  18. HDU-2717 BFS
  19. 华硕笔记本快速启动项里面没有usb设备解决办法
  20. 【Web_UI自动化_Python3_豆瓣批量删帖_seleniumtqdm】登录豆瓣-进入详情-批量删除留言-批量删除帖子_20201130

热门文章

  1. 关闭QQ好友上线提醒终极方案-(2016年4月20日)
  2. 最新章节 第285节 计算机房的用户们,偷香最新章节:第285节 祈祷
  3. 打开页面js自动加载的方法
  4. CRMEB多商户二开教程1
  5. 浪潮服务器安装文档,浪潮服务器系统安装.doc
  6. qbittorrent linux卸载,qBittorrent 3.3.7发布 - 增加删除与转移torrent文件
  7. excel中如何截取指定字符之间的字符
  8. 大班科学计算机的发明应用教案,大班科学活动教案:有用的工具
  9. MFC Edit Control编辑框中值得获取方法总结
  10. ASP.NET企业网站信息管理系统源码 CMS源码免费分享