Python之文件读写详解(2)

跟操作系统内核管理I/O的机制有关,有这种观点的大部分是做C开发的,特别是与内核相关的开发人员。为了提高读写速度,要写入磁盘的数据会先放进内存缓冲区,之后再回写。由于可能会同时打开很多文件,当要回写数据时,需要遍历以打开的文件判断是否需要回写。他们认为如果打开文件时指定了读写模式,那么需要回写时,只要去查找以“可写模式”打开的文件就可以了。

四、Python文件操作步骤示例

我们来读取这样一个文本文件:song.txt,该文件的字符编码为utf-8。

匆匆那年我们 究竟说了几遍 再见之后再拖延 可惜谁有没有 爱过不是一场 七情上面的雄辩 匆匆那年我们 一时匆忙撂下 难以承受的诺言 只有等别人兑现 1. 菜鸟实现(只是实现功能):

Python3实现:

# 第一步:(以只读模式)打开文件 f = open('song.txt', 'r', encoding='utf-8') # 第二步:读取文件内容 print(f.read()) # 第三步:关闭文件 f.close()

这里说下Python2的实现

# 第一步:(以只读模式)打开文件 f = open('song.txt', 'r') # 第二步:读取文件内容 print(f.read().decode('utf-8')) # 第三步:关闭文件 f.close()

说明:
Python3中已经内置对Unicode的支持,字符串str已经是真正的Unicode字符串。也就是说Python3中的文件读取方法已经自动完成了解码处理,因此无需再手动进行解码,可以直接将读取的文件中的内容进行打印;Python2中的字符串str是字节串,读取文件得到的也是字节串,在打印之前应该手动将其解码成Unicode字符串。关于这部分的说明,可以参考之前这篇文章<<再谈Python中的字符串与字符编码>>

2. 中级实现

在实现基本功能的前提下,考虑一些可能的意外因素。因为文件读写时都有可能产生IO错误(IOError),一旦出错,后面包括f.close()在内的所有代码都不会执行了。因此我们要保证文件无论如何都能被关闭。那么可以用try...finally来实现,这实际上就是try...except..finally的简化版(我们只用Python3来进行示例演示):

f = '' try: f = open('song.txt', 'r', encoding='utf-8') print(f.read()) num = 10 / 0 finally: print('>>>>>>finally') if f: f.close()

输出结果:

匆匆那年我们 究竟说了几遍 再见之后再拖延 可惜谁有没有 爱过不是一场 七情上面的雄辩 匆匆那年我们 一时匆忙撂下 难以承受的诺言 只有等别人兑现 >>>>>>finally Traceback (most recent call last): File "<stdin>", line 4, in <module> ZeroDivisionError: division by zero

输出结果说明,尽管with代码块中出现了异常,但是”>>>>>>finally“ 信息还是被打印了,说明finally代码块被执行,即文件关闭操作被执行。但是结果中错误信息还是被输出了,因此还是建议用一个完成的try...except...finally语句对异常信息进行捕获和处理。

3. 最佳实践

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/caffdd1e2c46f9d77ff37592b1ed18d3.html