2009-04-15 64 views
4

我希望我把问题框在正确的位置。我试图强迫自己成为更好的程序员。更好的意思是有效的。我想编写一个程序来识别目录中的文件并读取每个文件以供进一步处理。经过一番改组后,我得到了这样的结果:如何知道何时在Python中管理资源

for file in os.listdir(dir): 
    y=open(dir+'\\'+file,'r').readlines() 
    for line in y: 
     pass 
    y.close() 

因为y是一个列表,所以我得到一个AttributeError并不奇怪。当我编写代码片段时,我没有想到这一点。

我在想这件事,恐怕我有五个打开的文件(也有由DIR指定的目录中五个文件。

所以它运行我可以修复的代码,我打开后直接关闭该文件。他们我很好奇,如果我需要,或者Python的处理关闭文件在循环的下一次迭代如果是这样的话,我只需要编写:

for file in os.listdir(dir): 
    y=open(dir+'\\'+file,'r').readlines() 
    for line in y: 
     pass 

我猜测它(蟒蛇)不处理这是毫不费力的,我认为这可以被处理的原因是我已经改变了y所引用的对象/东西,当我开始第二次迭代时这里没有更多的内存引用了使用readlines方法打开和读取的文件。

+0

我必须失去了一些东西,但它是一个惊喜,我认为你会得到一个AttributeError如果y是一个列表。 – 2009-04-15 23:47:37

+0

我相信OP指的是'y.close()'这一行。 – 2009-04-15 23:50:48

+0

你不能关闭一个列表y是一个readlines()方法的列表 - 我希望method是readline的正确名称。 – PyNEwbie 2009-04-15 23:51:19

回答

11

Python将在垃圾收集时关闭打开的文件,因此通常可以忘记它 - 特别是在阅读时。

这就是说,如果你想关闭明确地,你可以这样做:

for file in os.listdir(dir): 
    f = open(dir+'\\'+file,'r') 
    y = f.readlines() 
    for line in y: 
     pass 
    f.close() 

不过,我们可以立即改善这一点,因为在Python中,你可以通过直接类文件对象进行迭代:

for file in os.listdir(dir): 
    y = open(dir+'\\'+file,'r') 
    for line in y: 
     pass 
    y.close() 

最后,在最近的Python,有 'with' 声明:

for file in os.listdir(dir): 
    with open(dir+'\\'+file,'r') as y: 
     for line in y: 
      pass 

with块结束时,python会为你关闭文件并清理它。

(您可能还需要寻找到os.path更多Python的工具来操作文件名和目录)

3

不要担心。 Python的垃圾收集器是好的,我从来没有遇到没有关闭文件指针的问题(至少对于读取操作)

如果您确实想要显式关闭文件,只需将open()存储在一个变量中,那么调用readlines()上,例如..

f = open("thefile.txt") 
all_lines = f.readlines() 
f.close() 

或者,你可以使用with声明,这是在Python 2.5添加为from __future__进口,并在Python 2.6 “适当” 补充说:

from __future__ import with_statement # for python 2.5, not required for >2.6 

with open("thefile.txt") as f: 
    print f.readlines() 

# or 

the_file = open("thefile.txt") 
with the_file as f: 
    print f.readlines() 

文件将在块的结尾处自动关闭。

..但是,在您发布的代码片段中还有其他更重要的事情需要关注,主要是文体事物。

首先,尽量避免使用字符串拼接手动构建路径。 os.path模块包含许多方法来以更可靠的跨平台方式执行此操作。

import os 
y = open(os.path.join(dir, file), 'r') 

此外,使用两个变量名,dirfile - 这两者都是内置函数。 Pylint是发现这样的事情,在这种情况下,将给予警告的好工具:

[W0622] Redefining built-in 'file' 
相关问题