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()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 编写Python小程序来统计测试脚本的关键字

    编写Python小程序来统计测试脚本的关键字

    这篇文章主要介绍了编写Python小程序来统计测试脚本的关键字的方法,文中的实例不仅可以统计关键字数量,还可以按主关键字来归类,需要的朋友可以参考下
    2016-03-03
  • Python树的平衡检测算法实现

    Python树的平衡检测算法实现

    树的平衡检测是指判断一棵树是否为平衡二叉树,即每个节点的左右子树高度差不超过1,本文主要介绍了Python树的平衡检测算法实现,感兴趣的可以了解一下
    2023-11-11
  • Python2.7.10以上pip更新及其他包的安装教程

    Python2.7.10以上pip更新及其他包的安装教程

    今天小编就为大家分享一篇Python2.7.10以上pip更新及其他包的安装教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python3实现从指定路径查找文件的方法

    Python3实现从指定路径查找文件的方法

    这篇文章主要介绍了Python3实现从指定路径查找文件的方法,涉及Python目录与文件的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Python机器学习之使用Pyecharts制作可视化大屏

    Python机器学习之使用Pyecharts制作可视化大屏

    pyecharts是一个用于生成Echarts图表的Python库,Echarts是百度开源的一个数据可视化 JS 库,可以生成一些非常酷炫的图表,这篇文章主要给大家介绍了关于Python机器学习之Pyecharts制作可视化大屏的相关资料,需要的朋友可以参考下
    2021-10-10
  • 解决python3.x安装numpy成功但import出错的问题

    解决python3.x安装numpy成功但import出错的问题

    这篇文章主要介绍了解决python3.x安装numpy成功但import出错的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 利用python实现AR教程

    利用python实现AR教程

    今天小编就为大家分享一篇利用python实现AR教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python使用knn实现特征向量分类

    python使用knn实现特征向量分类

    这篇文章主要为大家详细介绍了python使用knn实现特征向量分类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • python DataFrame中stack()方法、unstack()方法和pivot()方法浅析

    python DataFrame中stack()方法、unstack()方法和pivot()方法浅析

    这篇文章主要给大家介绍了关于python DataFrame中stack()方法、unstack()方法和pivot()方法的相关资料,pandas中这三种方法都是用来对表格进行重排的,其中stack()是unstack()的逆操作,需要的朋友可以参考下
    2022-04-04
  • 一文教你利用Python租到最合适的房子

    一文教你利用Python租到最合适的房子

    这篇文章主要为大家详细介绍了如何利用Python语言在爬取到房源数据后,挑选出符合自己要求的房子呢?感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09

最新评论