PyN*_*bie 4 python garbage-collection
我希望我能正确地解决这个问题.我试图强迫自己成为一个更好的程序员.更好,我的意思是效率.我想编写一个程序来识别目录中的文件并读取每个文件以便进一步处理.经过一些洗牌,我得到了这个:
for file in os.listdir(dir):
y=open(dir+'\\'+file,'r').readlines()
for line in y:
pass
y.close()
Run Code Online (Sandbox Code Playgroud)
因为y是一个列表,所以我得到一个AttributeError也就不足为奇了.当我编写代码片段时,我没有想到这一点.
我正在考虑这个,我担心我有五个打开的文件(dir指定的目录中有五个文件.
我可以修复代码,使其运行,并在打开文件后显式关闭它们.我很好奇,如果我需要或者如果Python处理在循环的下一次迭代中关闭文件.如果是这样,那么我只需要写:
for file in os.listdir(dir):
y=open(dir+'\\'+file,'r').readlines()
for line in y:
pass
Run Code Online (Sandbox Code Playgroud)
我猜它(python)确实毫不费力地处理了这个问题.我认为可以处理的原因是我已经更改了y引用的对象/事物.当我开始第二次迭代时,不再有使用readlines方法打开和读取的文件的内存引用.
Joh*_*uhy 11
Python会在收集垃圾时关闭打开的文件,所以通常你会忘记它 - 特别是在阅读时.
也就是说,如果你想明确地关闭,你可以这样做:
for file in os.listdir(dir):
f = open(dir+'\\'+file,'r')
y = f.readlines()
for line in y:
pass
f.close()
Run Code Online (Sandbox Code Playgroud)
但是,我们可以立即改进这一点,因为在python中你可以直接遍历文件类对象:
for file in os.listdir(dir):
y = open(dir+'\\'+file,'r')
for line in y:
pass
y.close()
Run Code Online (Sandbox Code Playgroud)
最后,在最近的python中,有' with '语句:
for file in os.listdir(dir):
with open(dir+'\\'+file,'r') as y:
for line in y:
pass
Run Code Online (Sandbox Code Playgroud)
当with块结束时,python将为您关闭文件并进行清理.
(您也可能希望研究os.path更多用于操作文件名和目录的pythonic工具)