中提到,每当不需要操作文件时,需要把通过open()函数打开的文件再通过close()关闭掉。
1 不关闭已打开的文件带来的影响
使用如图1所示的代码,不关闭已经打开的文件。
图1 不关闭已经打开的文件
从图1中可以看出,第2行代码打开了D盘根目录下“水果.csv”文件,在去读内容并且显示内容后,并没有调用close()函数关闭该文件;第5行代码调用了os模块中的system()函数,使得程序并没有马上结束,而是处于“暂停”状态,来模拟python程序在做其它事情。
运行图1显示的程序,效果如图2所示。
图2 程序运行效果
从图2中可以看出,程序在输出了读取到的内容之后,就处于“暂停”状态了,此时不要关闭该控制台窗口,让程序继续运行。此时,如果去删除或者移动“水果.csv”文件,就会显示如图3所示的提示信息。
图3 删除文件时的提示信息
也即是无法删除或者移动“水果.csv”文件,因为此时该文件被图1所示的程序所占用,只有该程序结束后,才能删除或移动“水果.csv”文件。
注意1 在没有close已打开的文件时,可以读取和修改文件内容,但是不能删除或移动该文件。
2 with as语句打开csv文件
使用with as语句打开csv文件,在该语句结束后,会自动关闭已打开的程序,代码如图4所示。
图4 使用with as语句打开csv文件
第2行代码使用with as语句打开csv文件,with和as的中间是打开文件的语句,as之后表示打开文件保存的变量;第3-4行表示打开文件后要做的事情,即读取文件内容并显示,此时with as语句结束,自动关闭已打开的文件,也就是说,虽然此时没有显式调用close()函数,但是“水果.csv”文件已经隐式地被关闭。
运行图4所示的程序,在保证程序处于“暂停”状态时,可以成功删除“水果.csv”文件。
当编写操作csv文件的代码时,可以使用with as语句打开csv文件,这样即使忘记调用close()函数关闭文件,也不影响后续操作。