为什么读写文件推荐使用 with 语句块?

1
2
with open('file_name') as f:
data = f.read()

能够使用 with 语句块的条件是 with 所求值的对象必须有一个 __enter__() 方法,一个 __exit__() 方法。

而紧跟在 with 关键字后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给 as 后面的变量。当 with 语句块中的全部语句被执行完之后,将调用前面返回对象的 __exit__() 方法。

对于读写文件来说,使用 with 语句块一般较为保险。在读文件时,如果使用了 with 语句块,在代码块结束后,由于自动执行了 __exit__() 方法,因此不需要手动使用 close() 方法来关闭被读的文件;当写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存中缓存起来,空闲的时候再进行写入,只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘,忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了,而使用 with语句块就有效避免了这个问题。