在上一篇《手把手陪您学Python》32——文件的读取中,我们学习了读取文件的几种方法。这一篇中,我们将学习关闭文件的方法。

当我们使用open()打开并使用文件后,显式地关闭文件是非常重要而必要的一件事。如果不能很好地处理文件的关闭,可能会导致数据丢失或者受损。

其实在我们上一篇文章读取文件之后,就应该使用close()方法将文件关闭,但由于当时还没有涉及这部分内容,就没有进行文件关闭的操作,其实是一种不规范的做法。

关闭文件的方法有两种。

1、使用close()手动关闭文件

当我们对打开的文件进行完读取操作,包括后面要学习的写入操作后,就要使用close()方法将文件关闭,否则就可能导致数据或者文件的冲突或者错误。

close()方法本身很简单,但需要注意的是,在对文件进行关闭操作时,要记得是对打开的对象(file_object)进行关闭操作,而不是读取后的对象(file)进行关闭操作。

In [1]: path = 'lesson/text/contents.txt'
        file_object = open(path, encoding = 'utf-8')
        file = file_object.read()
        print(file.rstrip())
        file_object.close()
        file = file_object.read()   # 关闭文件后的再次读取
Out[1]: 《手把手陪您学Python》1——为什么要学Python?
        《手把手陪您学Python》2——Python的安装
        《手把手陪您学Python》3——PyCharm的安装和配置
        《手把手陪您学Python》4——Hello World!
        《手把手陪您学Python》5——Jupyter Notebook
        《手把手陪您学Python》6——字符串的标识
        《手把手陪您学Python》7——字符串的索引
        《手把手陪您学Python》8——字符串的切片
        《手把手陪您学Python》9——字符串的运算
        《手把手陪您学Python》10——字符串的函数
        ---------------------------------------------------------------------------
        ValueError                                Traceback (most recent call last)
        <ipython-input-5-90b7211a7dc0> in <module>
              4 print(file.rstrip()) 
              5 file_object.close()
        ----> 6 file = file_object.read()
        
        ValueError: I/O operation on closed file.

如同上面的错误一样,当文件关闭后是不能够再次读取的,错误信息也提示读取操作不能在关闭的文件上进行。

除了要记得在使用完文件后将文件关闭,还要注意文件关闭的时机。如果在我们还没有使用完文件就提前调用close()将文件关闭了,就可能导致程序的错误了。

使用with关键字就可以避免这种情况的出现。

2、使用with自动关闭文件

with关键字可以在其下面的程序全部运行完毕后自动关闭文件,既能够避免我们忘记关闭文件,也不会提早将文件关闭,是比较推荐的一种使用方法。

with关键字和for循环、if循环等关键字一样,都需要在关键字所在行的末尾增加冒号“:”,同时对with下的代码进行缩进,这样with才能够知道下面有哪些程序,什么时候运行完,之后再关闭文件。在文件关闭后的代码就不能再缩进了,而要和with保持同样的位置以进行区分。

对于使用with方法打开的文件对象的命名,可以使用as关键字,文件对象的名字就放在as之后。程序如同以下实例所示,同时也增加了再次读取的代码验证是否已经自动关闭。

由于我们已经学会了文件关闭的方法,所以后面的程序中,我们都会规范地将文件关闭,这也是我们养成良好编程习惯的开始。