python学习笔记-tip49(io编程--文件读写)
引言
python内置了读写文件的函数,用法和C语言是兼容的
读文件--open()函数
用法:传入文件名和标识符(r,w)即读,写
示例:
>>>f=open('/Users/guaju/test.txt','r')
这样,我们就成功的打开了文件
但是如果这个文件不存在,open()函数就会报出IOError的异常,并且给出错误码,和详细的信息告诉你文件不存在
如果文件打开成功,我们就可以通过read()的方法,将文件中的内容全部读出来,然后用一个str对象表示出来,现在呢,我们看一个示例
我们在桌面新建一个hello.txt的文件,然后里面输入内容“helloworld”,我们尝试读取一下这个文件中的数据
下面我们来说下关闭文件的方法 close()
文件打开然后操作完毕之后,必须要对文件进行关闭,因为文件对象会占用操作系统的资源,关闭文件意味着释放资源,所以我们必须有良好的编程习惯
f.close()
由于文件读写都有可能出现 IOError,所以一旦报错,关闭文件的代码:
f.close()
有时候会无法被调用到,程序就异常退出。
所以,为了保证无论是否出错,都能保证正常的关闭文件,我们可以使用try...finally来实现
try:
f=open('Users/guaju/Desktop/hello.txt','r')
print(f.read())
finally:
if f:
f.close()
这样写固然是合理的,但是如果我们频繁操作文件的话,这样写就有些繁琐了
python提供了更加合适的方法
with语句来自动帮助我们调用close()方法
请看代码示例:
with open('Users/guaju/Desktop/hello/txt','r') as f:
print(f.read())
这个写法实现的效果和上面的try...finally是一样的,但是代码却异常简洁
我们来深究下read()方法
上文中我们知道了,调用read()方法,会一次性的将文件中的全部信息读取出来,那么如果文件有10G,那么电脑内存就爆掉了,所以为了安全起见,可以反复调用
- read(size)方法,这样每次最多读取size个字节的内容。
- 另外,使用readline() 可以每次读取文件中的一行内容
- 此外,使用readlines()可以一次性读取所有内容,并且按行返回list
因此要根据需要,决定什么时候怎么调用
经验之谈
如果文件很小,read()方法是最佳的
如果不能确定文件大小,那么read(size)来反复调用,比较保险
如果是读取配置文件,那么使用readlines()比较合适
下面来说明一下readlines()方法使用小示例
for line in f.readlines():
#strip()方法可以把末尾的回车符 ”\n“ 删掉
print(line.strip())
file-like Object
就是一种类的类型,有read()方法的对象,在python中统称为file-like Object。
这种file-like Object可以是
file文件
内存的字节流
网络流
自定义流
等等
file-like Object 不要求从特定类继承,只要写个 read() 方法就行了。
StringIO 是在内存中创建的file-like Object,常用作临时缓冲。
二进制文件
前面提到的都是读取的文本文件,而且都是utf-8格式的文本文件,要读取二进制文件
比如图片、视频、音频等,用‘rb’模式打开文件即可
比如现在我要打开我桌面上的杨幂的图片
路径为:‘Users/guaju/Desktop/ym.jpg’
模式为:‘rb’
那么就这样书写代码就可以了
我们看到读取到的图片的信息是16进制展示的
其实原图是这样的字符编码
要读取飞utf-8编码的文本文件的话,就要给open()传入encoding的参数,例如读取GBK编码的文件,我们这么写
f=open('User/guaju/Desktop/gbkfile.txt','r',encoding='gbk')
当然,我们肯定会遇到编码不规则的文件,那么必然会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
遇到这种情况,open()函数还接受一个errors的参数,表示如果遇到编码错误后,如何处理,当然最简单的处理方式是忽略
f=open('Users/guaju/Desktop/hello.txt','r',encoding='gbk',errors='ignore')
写文件
写文件和读文件是一样的,唯一区别调用open函数是,输入的模式变化,输入模式变为
‘w’ 或者是‘wb’,分别表示输出字符,或者输出二进制内容
此外,“读”read() 则转化为写write()
我们来看下示例代码
with open('Users/guaju/Desktop/hello2.txt','w') as f1
f1.write('hello python')
with open('Users/guaju/Desktop/hello2.txt','r') as f2
f2.read()
需要注意的是,程序执行完write()方法之后,要输入的文本或者字节有时并不会真正的完整的输出到文件中去,而是当我们调用close()方法时,才会完成完整的输出,所以我们一定不要忘了调用close()方法。
最好的做法就是我上边的做法,使用with语句
当然,如果要写入指定编码的文件,那么同上放一样,给open()方法设置encoding的配置,将字符串自动转换成为指定的编码
还有两点需要注意
-
如果文件不存在,那么不能直接写入,需要先创建再进行写入
-
当我们写文件时,如果传入的模式是'w'的话,那么如果写的操作执行很多次,那么文件中的内容不会追加,而是会覆盖,那么怎么解决这个问题呢?
其实这个模式替换成'a'就可以了
我们来简单看一个示例
本例是文件不存在的情况
接下来我们先把文件创建出来,然后重新执行一遍
现在大家看到区别了吧
总结
用到的函数有
open()
close()
read()
write()
打开文件的配置常见的有
'r'
'w'
'rb'
'wb'
'a'
配置编码的方式
encoding='编码方式'
错误的处理方式
errors='ignore'
with的使用
with open('文件路径','打开方式',encoding='编码方式',errors='处理方法') as f:
不多,很简单,多练练就好了