一. 如何读写文本文件
实际案例:
- 某文本文件编码格式已知(如UTF-8,GBK,BIG5),在Python2.x 和Python3.x 中分别如何读取该文件?
Python2.x与3.x中字符串的语义的变化:
Python2 python3
----------------------------
str -> bytes
unicode -> str
解决方案:
- python2.x:写入文件前对unicode编码,读入文件后对二进制字符串解码,
- 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)
二. 如何处理二进制文件
实际案例:
-
wav是一种音频文件的格式,音频文件为二进制文件。wav文件由头部信息和音频采样数据构成。前44个字节为头部信息,包括声道数,采样频率,PCM位宽等,后面是音频采样数据。
使用Python,分析一个wav文件头部信息,处理音频数据。
解决方案:
- open函数想以二进制模式打开文件,指定mode参数为‘b’。
- 二进制数据可以用readinto,读入到提前分配好的buffer中,便于数据处理。
- 解析二进制数据及恶意使用标准库中的struct模块的unpack方法。
代码示例:
无
三. 如何设置文件的缓冲
实际案例:
- 将文件内容写入到硬件设备时,使用系统调用,这类I/O操作的时间很长,为了减少I/O操作的次数,文件通常使用缓冲区。(有足够多的数据才进行系统调用)文件的缓冲行为,分为全缓冲、行缓冲、无缓冲。
如何设置Python中文件对象的缓冲行为?
解决方案:
- 全缓冲:open函数的buffering设置为大于 1 的整数n,n为缓冲区大小。
- 行缓冲:open函数的buffering设置为 1 。
- 无缓冲:open函数的buffering设置为 0 。
代码示例:
# _*_ coding:utf-8 _*_
# @Author : TianYu
# @Time : 2017/10/16 13:48
# @File : 如何设置文件的缓冲.py
#通常一个缓冲区块的大小是4096个字节
#代码的缓冲效果在Linux下的shell环境中利用文件监视能更好的呈现
# 1 全缓冲:open函数的buffering设置为大于 1 的整数 n ,n 为缓冲区大小
f = open('demo1.txt', 'w', buffering= 2048)
f.write('+' * 1024)
f.write('+' * 1023)
f.write('-' * 2) #缓冲区中的数据大于 n 之后才写入
# 2 行缓冲:open函数的buffering设置为 1
f = open('demo2.txt', 'w', buffering= 1)
f.write('abc')
f.write('\n') #遇到一个换行符就进行一次 I/O操作
# 3 无缓冲:open函数的buffering设置为 0
f = open('demo3.txt', 'w', buffering= 0)
f.write("abcd") #实时的写入到磁盘中