如何读写文本文件
实际案例:
某文本文件编码格式已知(如UTF-8,GBK, BIG5),在python2和python3中分别如何读取文件。
解决方案:字符串的语义发生了变化,
python2 和 python3
str ==> bytes str是连续的
unicode ==> str
unicode ==> str
s = u'你好'
s.encode('utf8') #得到字符串的形式
s.encode('gbk')# 也得到了字符串形式
#同时也可以对字符串进行解码
print ('\xc3\xa4\xc2\xbd\xc2\xa0\xc3\xa5\xc2\xa5\xc2\xbd'.decode('utf8')) #要注意的是,以什么形式进行编码,就要以什么形式进行解码,否则就会出现乱码。
python2x版本中
存储内容的时候,将字符要对Unicode字符串进行某种形式的编码成字节,才能将其写入文件,但是读取文件的时候则刚好反过来,我们要将字节进行解码,将其还原成Unicode。
#写入文件中文形式
f = open('py2.txt', 'w')
s = u'你好'
f.write(s.encode('utf8'))
f.close()
#读取文件
f = open('py2.txt', 'r')
t= f.read()
print(t.decode('utf8')) #注意,以什么形式编码就要以什么形式解码
在python3x版本中
b'duan' #表示一个bite,需要在前面加b,python2中
‘duan' #python2中直接就是一个bite。
u'你好' #在python2中需要加U来表示Unicode。
'你好' #在python3中不需要加u就表示一个Unicode字符串
python3中的文件读写:python3中的函数指定’t'的文本格式,encoding指定编码形式
f = open('py3.txt','wt', encoding='utf8')
f.write('你好,我爱编程')
f.close()
f=open('py3.txt','rt', encoding='utf8')
t = f.read()
print(t)
直接帮我们编码和解码,不需要自己进行。
5-2 如何处理二进制文件?[这个我没有音频文件]
实际案例
wav是一种音频文件,音频文件作为二进制文件。
wav文件由头部信息和音频采样数据构成。前44个字节为头部信息,包括声道数,采样频率,PCM位宽等等,后面是音频采样数据。
使用python,分析一个wav文件头部信息,处理音频数据。
5-3如何设置文件的缓冲
实际案例:将文件内容写入到硬件设备时,使用系统调用,这类i/O操作的时间很长。为了减少I/O操作到的次数。文件通常使用缓冲区(有足够多的数据才能进行系统调用),文件的缓冲行为,分为全缓冲,行缓冲和无缓冲。
如何设置python中文件对象的缓冲行为?
解决方案:
全缓冲:open 函数的buffering 设置为大于1的整数n,n为缓冲区的大小
f = open('demo.txt','w',buffering=2048) #缓冲区间的字节设置
f.write('+' * 1024)
f.write('*' * 1024) #此时刚好满了2048个字节,但是还不会进行输出
f.write('-' * 1) #超过了缓冲区间允许的字节,有输出
行缓冲:open 函数的buffering设置为1
f = open('demo1.txt','w',buffering=1)
f.write('aaaa')
f.write('21314')#无论输出多长都不会有输出,直到写入一个换行符
f.write('\n') #输入换行符之后就有内容的输出
tail -f demo1.txt #终端检测命令
无缓冲:open 函数的buffering设置为0
f = open('demo2.txt','w',buffering=0)
f.write('a') #只输出一个字符的时候都会有输出
tail -f demo2.txt #直接就有内容输出
5-4 如何将文件映射到内存
实际案例:
1.在访问某些二进制文件的时候,我们希望能够把文件映射到内存中,可以实现随机访问(framebuffering文件中)
2.某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem/某范围,去访问这些寄存器。
3.如果多个进程同时映射同一个文件,还能实现进程通讯的目的。
解决方案:使用标准库中mmap模块的mmap()函数,它需要一个打开的文件描述符作为参数。
#首先在linux下进行命令行操作
cd if=/dev/zero/ of=demo.bin bs=1024 count=1024 #创建一个二进制文件
od -x demo.bin #以16进制的形式查看这个文件
#在python环境下打开
import mmap
f = open('demo.bin','r+b')
f.fileno() #获得文件描述符
m=mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) #第一个参数是文件描述符,第二个参数是映射的文件长度,第三个参数是文件的权限设置
type(m) #为mmap.mmap对象,可以进行相数组一样的操作
m[0] #数组的引索,返回字节形式的0, \x00
m[10:20] #数组切片
m[0] ='\x88' #最字节进行修改
m[4:8] ='\xff' *4 #注意修改的字符长度要与切片的长度一样长
m=mmap.mmap(f.fileno(), mmap.PAGESIZE*8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE*4) #offset必须是pagesize的整数倍
m[:0x1000]='\xaa' * 0x1000
#命令行检查
od -x demo.bin
5-5 如何访问文件的状态
实际案例:
在某些项目中,我们需要获得文件的状态,例如:
1.文件的类型(普通文件,目录,符号链接,设备文件。。。。)
2.文件的访问权限
3.文件的最后的访问/修改/节点状态更改时间
解决方案:
系统说明:标准库中三个系统调用stat,fstat,lstat获取文件状态
快捷函数:标准库中os.path下的一些函数,使用起来更加简洁