IO中 Stream是很重要的概念,数据只允许单向流动
InpurStream 输入 外端===》内存
OutputStream输出 内存===》外端
为解决IO中cpu 和 磁盘速度不匹配问题,有两种解决方法:同步IO、异步IO
异步IO性能远远高于同步IO
但是异步IO 的编程模块的复杂度远远高于同步IO
现代操作系统不允许普通程序直接操作磁盘,读写文件时都是程序请求操作系统打开文件对象,然后对文件进行读取数据或者写入数据
读文件
读取文本文件,并且UTF-8编码的文件
打开
open('文件名','标识符')
f=open('/xx/xx/xx.txt','r') #r表示读若文件不存在,抛出IOError异常
读数据
read()方法一次性读取文件的全部数据,读到一个str对象中
f.read()f.read()调用后,就读取到了文件末尾,在调用read()函数,读到数据为空。
若需要再次读取数据,需要关闭数据流f.close()后 、重新打开文件、然后再读取文件f.read()
关闭文件
读取文件完毕,必须对关闭数据流
方法:f.close()
保证正确的关闭文件
文件读写一旦出现错误,后面的f.close()将不会执行。为保证无论是否出错都正确关闭文件,使用try实现
try: f=open('/xx/xx/1.txt','r') print(f.read()) finally: if f: f.close()python 引入with语句 可以自动调用close()方法:
with open('/xx/xx/1.txt','r') as f: print(f.read())
多种读取方法
f.read() 一次性读取完文件
f.read(n) 每次最多读取n个字节,适合循环读取
f.readline() 每次读取一行
f.readlines() 一次读取完,并按行返回到list中
把每行最后的’\n‘去掉
for line in f.readlines(): print(line.strip())
二进制文件
要读取二进制文件,比如图片,视频,要用rb模式打开
>>> f = open('/Users/michael/test.jpg', 'rb') >>> f.read() b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
字符编码
要读取非UTF-8编码的文本,需要制定encoding参数
f=open('/xx/xx/x.txt','r',encoding='gbk')
如果文件中包含一些非法编码的字符,open方法还可以接受一个errors的参数
f=open('xx/xx.txt','r',encoding='gbk',errors='ignore')errors表示遇到非法编码字符如何处理,最简单的就是忽略。
写文件
写文件和读文件是一样的,唯一区别是open方法的标识符是'w'或者'wb',表示写文件或者写二进制文件
f.open('/xx/xx.txt','w') f.write('xxxxxx') f.close()
可以反复的调用f.write()方法对文件进行写入,但是每次都要及时调用f.close()方法
写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用
close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。
同样的可以用with语句保证close()方法的执行:
with open('/xx/xx.txt','w') as f: f.write('xxxxx')
要写入非UTF-8文件,需要在open方法中指定编码格式,将字符创转化为指定格式后写入文件:
f=open('/xx/xx.txt','w',encoding='gbk') f.write('xxxxxx')
当标识符为'w' 时,若文件存在,会把原来的文件覆盖掉。
open 传入标识符 'a' 会以append(追加)的方式写入文件