如何读写文本文件
python2中文本文件读写
f = open("py2.txt","w")
s = u"你好"
f.write(s.encode('gbk'))
f.close()
f = open('py2.txt','r')
t = f.read()
print(t)
print(t.decode('gbk'))
python3中文本文件读写
f = open("py3.txt","wt",encoding='utf8')
f.write("你好")
f.close()
f = open("py3.txt","rt",encoding='utf8')
s = f.read()
print(s)
#自动帮助我们完成了编解码,其实读取写入的还是字节
如何处理二进制文件?
以WAV格式为例子
wav是一种音频文件的格式,为二进制
前44字节为头部信息
包括 声道数 采样频率 PCM位宽等等
后面是音频采样数据
使用 vlc demo.wav播放
f = open('demo.wav','rb')
#头部信息
info = f.read(44)
import struct
shengdaoshu = struck.unpack('h',info[22:24])
# h 小段字节序
caiyangpinlv = struck.unpack('i',info[24:28])
# int
bianmakuandu = struck.unpack('h',info[34:36])
import array
f.seek(0,2)
f.tell()
n=(f.tell()-44)/2
buf = array.array('h',(0 for _ in xrange(n)))
f.seek(44)
f.readinto(buf) # 把数据读入buf中
for i in xrange(n):buf[i] /=8
f2 = open('demo2.wav','wb')
f2.write(info)
buf.tofile(f2)
f2.close()
如何设置文件的缓冲
IO操作
磁盘是属于块设备
写入一个字节 和 写入4096个字节 耗时是一样的
文件的缓冲分为
全缓冲 ,缓冲区有一定大小,满足条件
行缓冲,终端换行符
无缓冲,串口设备,时时的。
f = open("",buffering=2048) 全缓冲
f = open("",buffering=1) 行缓冲
f = open("",buffering=0) 无缓冲
如何将文本映射到内存
应用场景
1.将整个文件 映射到内存中,像访问数组一样访问文件
当修改数组的时候,文件也同时被修改
2.某些嵌入式设备,我们映射 /dev/mem某范围
3.多个进程映射同一个文件,还能实现进程通信的目的
#创建一个二进制文件
dd if=/dev/zero of=demo.bin bs=1024 count=1024
#16进制查看这个文件
od -x demo.bin
import mmap
f = open('demo.bin','r+b')
#文件描述符,0是整个文件。access 写权限
m = mapp.mapp(f.fileno(),0,access=mmap.ACCESS_WRITE)
m[0] = '\x88'
m[4:8] = '\xff' * 4
offset = 内存页的整数倍
如何访问文件的状态
1 文件类型
2 文件的访问权限
3 文件的最后访问 修改 节点状态
4 文件的大小…等等
使用os 系统调用 stat fstat lstat
import os
import stat
s = os.stat('a.txt')
stat.S_ISDIR(s.st_mode) #判断是否为文件夹
stat.S_ISREG(s.st_mode)
快捷函数
os.path.isdir('x.txt')
os.path.islink('x.txt')
os.path.isfile('x.txt')
三个时间
getatime getctime getmtime
普通文件大小
getsize
如何使用临时文件
传感器每收集1G数据,进行数据分析
如果常驻内存,消耗大量的内存资源
使用临时文件,不需要命名,且关闭后会被删除掉
from tempfile import TemporaryFile,NamedTemporaryFile
f = TemporaryFile()
f.write('abcde'*1000)
只能由对象f来访问,不能由系统路径来访问
ntf = NamedTemporaryFile()
ntf.name
# /tmp/tmp8Zs8Rc 临时文件创建在这个下面
临时文件关闭后,会被删除
不删除的话, ntf = NamedTemporaryFile(delete=False)