Python基础学习10(文件读写)

Python基础入门10(文件读写)

本文主要内容来自,廖雪峰Python教程

加以个人的一些总结或心得(也许有)

学习前需要了解的知识:

磁盘上读写文件的功能都是由操作系统推荐提供的。
现代操作层系统,不允许普通的程序直接操作磁盘。
所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),
然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)

读文件

以读文件的模式打开一个文件对象,使用Python内饰的 open() 函数,
传入 文件名 和 标示符

E.g
>>>f=open('文件名?还是文件位置','r')

r 表示读,成功打开了一个文件

如果文件不存在, open() 会抛出一个 IOError的错误,给出错误吗和详细的信息报告说明文件不存在。

如果文件打开成功,调用 read() 方法,

f.read([size])
可以从文件中读取指定字节数,未给定或负则读取所有

可以一次读取文件的全部内容,Python把内容读到内存,用一个 str 对象表示

E.g
>>>f.read()
'Hello world!'

最后一步是调用 close() 方法关闭文件,文件使用完毕必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

E.g
>>>f.close()

由于,文件读写时都有可能产生IOError,一旦出错,后面的 f.close() 就不会调用。
所以,为了保证无论出错是否都能正确地关闭文件,可以使用 try finally来实现

E.g
try:
	f=open('/path/to/file','r')
	print(f.read())
finally:
	if f:
		f.close()

每次都这么写会很繁琐,所以,Python引入了 with 语句来自动帮我们调用 close()方法:

E.g
with open('/path/to/file' , ' r ') as f:
	print(f.read())

这个与上文的例子相同,代码更加简洁,且不用调用 f.close()
调用 read()会一次性读取文件的全部内容,如果文件有10G,内容就爆了,

所以,保险起见,可以反复调用 read(size) 方法,每次最多读取size字节的内容。
另外,调用 readline() 可以每次读取一行内容,调用 **readlines()**一次读所有内容并按行返回 list。因此,按需调用。

如果文件很小,read() 一次性读取最方便;
如果不能确定文件大小,反复调用 read(size) 比较保险;
如果是配置文件,调用 readlines() 最方便。

E.g
for line in f.readlines():
	print(line.strip()) # 把末尾的'\n'删掉

二进制文件

前面讲的都是默认读取文本文件,并且是UTF-8编码的文本文档。要读取二进制文件,比如图片、视频等等,用’ rb '模式打开文件即可。

>>> f = open('/Users/micheal/test.jpg', ' rb ')
>>>f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节

字符编码

要读取非UTF-8编码的文本文件,需要给 open()函数传入 **encoding()**参数。
例如,读取GBK编码的文件:

E.g
>>>f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>>f.read()
'测试'

遇到有些编码不规范的文件,也可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂一些非法编码的字符。在这种情况下,open() 函数还接收一个 errors 参数,表示如果遇到编码错误后如何处理。
最简单的方式是直接忽略:

>>>f = open('/User/micheal/gkb.txt', 'r' ,encoding='gkb',errors='ignore')

写文件

写文件和读文件一样的,调用 open()函数的时,传入标识符 ’ w ’ 或者 ’ wb '来表示写文本文件或写二进制文件:

>>>f = open('/Users/micheal/test.txt', 'w')
>>>f.write('Hello,world!')
>>>f.close()

可以通过反复调用write()来写入文件,但是一定要调用 f.close()来关闭文件。

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。
只有调用 close()时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
所以还是用 with 语句来得保险:

>>>with open('文件路径','w') as f:
		f.write('Hello,world!')

要写入特定编码的文本文档,请给 open()函数传入 encoding 参数,将字符串自动转换成指定编码。

以’ w ‘模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。
以’ a '模式写入文件,可以追加到文件末尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值