【永利集团304com】python高级编程技巧,如何处理二进制文件

实际案例

WAV是一种音频文件的格式,音频文件为二进制文件。WAV文件由头部信息和音频采样数据构成。前44个字节为头部信息,包括声道数、采样频率和PCM位宽等,后面是音频采样数据。

永利集团304com 1

(注:图片来源于互联网,如若侵权请联系本人立删,谢谢!)

请使用Python分析一个WAV文件头部信息,处理音频数据。

解决方案:

  • open函数以二进制模式打开文件,指定mode参数为’b’
  • 二进制数据可以用readinto读入到提取分配好的buffer中,便于数据处理
  • 解析二进制数据可以使用标准库中的struct模块的unpack方法

注:关于unpack()的参数问题,Python官方文档中并没用明确说明。因此,可查看嘎啦的博文。

具体代码如下:

# -*- coding: utf-8 -*-import structimport arrayf = open('test.wav', 'rb')# 读取文件前44个字节的数据info = f.read# 解析二进制数据--声道数print struct.unpack('h', info[22:24])# WAV文件中data部分的大小 / 数据类型的大小 -> buffer的大小f.seekn =  - 44) / 2buf = array.array('h', (0 for _ in xrange# 将数据读至buf中f.seekf.readintofor i in xrange: # 数据处理,相当于将音频文件的声音变小 buf[i] /= 8f.close()# 创建demo.wavf = open('demo.wav', 'wb')# 将test.wav中前44个字节的数据写入文件f.write# 将buf中的数据写入文件buf.tofilef.close()

一. 如何读写文本文件

实际案例:

  1. 某文本文件编码格式已知(如UTF-8,GBK,BIG5),在Python2.x
    和Python3.x 中分别如何读取该文件?
    Python2.x与3.x中字符串的语义的变化:
    Python2 python3


    str -> bytes
    unicode -> str
解决方案:
  1. python2.x:写入文件前对unicode编码,读入文件后对二进制字符串解码,
  2. python3.x:open函数指定‘t’的文本模式,encoding指定编码格式。
代码示例:
# _*_ coding:utf-8 _*_
# @Author   : TianYu
# @Time     : 2017/10/16 13:28
# @File     : 如何读写文本文件.py

#(1)python 2.x:写入前对Unicode编码,读入文件后对二进制字符串解码
#该段代码请在Python2.x的环境下运行
f =open('py2.txt', 'w') #只写
s = u'你好' #Python2中字符串前加一个 'u' 才代表Unicode字符串
f.write(s.encode('gbk')) #编码
f.close()
f = open('py2.txt', 'r') #只读
t = f.read() #一次性读出来
print(t.decode('gbk')) #以相同的编码格式进行解码

#####################################################

#python 3.x:open函数指定't'的文本模式,encoding指定编码格式
f = open('py3.txt','wt',encoding='utf8') #'t'不写的话默认也是文本模式
f.write('你好,我爱编程.')
f.close()
f = open('py3.txt', 'rt', encoding='utf8') #自动完成编解码
s = f.read()
print(s)

二. 如何处理二进制文件

实际案例:

  1. wav是一种音频文件的格式,音频文件为二进制文件。wav文件由头部信息和音频采样数据构成。前44个字节为头部信息,包括声道数,采样频率,PCM位宽等,后面是音频采样数据。
    使用Python,分析一个wav文件头部信息,处理音频数据。
解决方案:
  1. open函数想以二进制模式打开文件,指定mode参数为‘b’
  2. 二进制数据可以用readinto,读入到提前分配好的buffer中,便于数据处理。
  3. 解析二进制数据及恶意使用标准库中的struct模块的unpack方法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注