一. 如何读写文本文件
实际案列
某文本文件编码格式(如UTF-8, GBK, BIG5),
在python2和python3 中分别如何读取该文件?
原理
字符串的语义变化
python2 python3
--------------------------
str -> bytes
unicode -> str
- python2: 写入文件前对 unicode 编码, 读入文件后对 字节 进行解码
- python3: open函数指定't'的文本模式, encoding指定编码格式
读写代码
# python2 先encode编码,再写入, 读取后还要解码
s = u'我是python2'
type(s)
# 结果<type 'unicode>
f = open('a.txt', 'w')
f.write(s.encode('utf8'))
f.flush() # 从内存中放入磁盘中 这里可以用f.close()
f = open('a.txt')
txt = f.read() # '\xe6\x88....... 此时是字节
txt.decode('utf8') # u'\xe6\x88..... 此时是unicode 可以print到 我是python2
# python3
s = '我是python3'
f = open('b.txt', 'wt', encoding='gbk') # t可以不写 python3 默认文本模式打开
f.write(s)
f.flush()
f = open('b.txt', encoding='gbk')
txt = f.read() # 直接读取
print(txt) # 我是python3
print(type(txt)) # <class 'str'> 在python3 中即 unicode
二. 如何处理二进制文件
实际案例
wav 是一种音频文件的格式, 音频文件为二进制文件。
wav 文件由头部信息和音频采样数据构成。 前面为头部信息, 包括声道数, 采样频率, 编码位宽等等, 后面是音频采样数据
使用python, 分析一个 wav 文件头部信息, 处理音频数据。
解决方案
- open函数以二进制文件打开, 指定mode 参数为b
- 二进制数据可以用readinto, 读入到提前分配好的buffer中
- 解析二进制数据可以使用标准库中的struc