Python如何使用struct.unpack处理二进制文件
更新时间:2024年02月10日 10:10:29 作者:AllardZhao
这篇文章主要介绍了Python如何使用struct.unpack处理二进制文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
如何处理二进制文件?
实际案例
- wav是一种音频文件的格式,音频文件为二进制文件。
- wav文件由头部信息和音频采样数据构成,前44个字节为头部信息,包含声道数、采样频率、PCM位宽等等,后面是音频采样数据。
- 使用python分析一个wav文件头部信息,处理音频数据。
WAV格式如下:
简单分为两部分,第一部分前44个字节是音频文件的一些信息,第二部分44个字节后面是音频文件的采样数据。
解决方案
- open函数想以二进制模式打开文件,指定mode参数为'b'。
- 二进制数据可以用fromfile(Python2中可以使用readinto),读入到提前分配好的buffer中,便于数据处理。
- 解析二进制数据可以使用标准库中的struct模块的unpack方法。
代码演示
(1)struct.unpack方法简单使用
# 以二进制形式打开文件 f = open('微信语音视频.wav', 'rb') # 读取前44字节 info = f.read(44) print(info) import struct ''' struct.unpack方法介绍: unpack(format, buffer) format:解析类型 buffer:需要解析二进制串 例: 构造两个字节的二进制串,format默认为小端字节顺序, h为16为,结果:2*256+1=513 struct.unpack('h', b'\x01\x02') 指定format为大端字节顺序,结果:256+2=258 struct.unpack('>h', b'\x01\x02') ''' # print(help(struct.unpack)) # 解析声道数,Num Channels为22到24字节 print(struct.unpack('h', info[22:24])) # 解析采样频率,SampleRate为24到28字节,i为int类型 print(struct.unpack('i', info[24:28])) # 编码宽度,BitsPerSample为34到36字节 print(struct.unpack('h', info[34:36]))
(2)实现二进制文件wav的处理
# _*_ encoding:utf-8 _*_ import array ''' 读取data数据部分不希望是字符串形式,因为字符串不支持数学运算, 对它不方便数据处理,最好读取到类似于C语言中数组中去 ''' # 修改文件指针移动到文件末尾 f.seek(0, 2) # 报告文件指针,也就是文件大小 print(f.tell()) # 数组的长度为文件字节长度减去44个字节,除2为采样宽度 n = (f.tell() - 44) // 2 # 创建数组,储存data部分数据 buf = array.array('h', []) # 将文件的数据读入到buf当中,不返回字符串 f.seek(44) buf.fromfile(f, n) print(buf[0]) print(len(buf)) # 将采样缩小一定程度,最终体现就是声音变小 for i in range(n): buf[i] //= 8 # 将数据存入到一个新文件 f2 = open('demo.wav', 'wb') f2.write(info) buf.tofile(f2) f2.close()
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
解决python3.x安装numpy成功但import出错的问题
这篇文章主要介绍了解决python3.x安装numpy成功但import出错的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-11-11python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
这篇文章主要给大家介绍了关于python DataFrame中stack()方法、unstack()方法和pivot()方法的相关资料,pandas中这三种方法都是用来对表格进行重排的,其中stack()是unstack()的逆操作,需要的朋友可以参考下2022-04-04
最新评论