python - 如何知道何时在 Python 中管理资源

标签 python garbage-collection

我希望我的问题是正确的。我试图强制自己成为一个更好的程序员。我所说的更好是指高效。我想编写一个程序来识别目录中的文件并读取每个文件以进行进一步处理。经过一番洗牌后,我得到了这个:

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

我得到一个 AttributeError 应该不足为奇,因为 y 是一个列表。我在写代码片段时没有考虑到这一点。

我正在考虑这个,我担心我有五个打开的文件(dir指定的目录中有五个文件。

我可以修复代码使其运行,并在打开文件后明确关闭文件。我很好奇我是否需要或 Python 是否会在循环的下一次迭代中处理关闭文件。如果是这样,那么我只需要写:

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

我猜它 (python) 确实可以毫不费力地处理这个问题。我认为这可能得到处理的原因是我已经更改了 y 引用的对象/事物。当我开始第二次迭代时,不再有对使用 readlines 方法打开和读取的文件的内存引用。

最佳答案

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 block 结束时,python 将为您关闭文件并清理它。

(您可能还想查看 os.path 以获得更多用于操作文件名和目录的 pythonic 工具)

关于python - 如何知道何时在 Python 中管理资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754187/

相关文章:

python - 漂亮的汤刮刀和 if...else

python - Beautiful Soup 在 """和 "<"等特殊字符上崩溃

c - Git - 垃圾收集器是否允许并行运行?

java - 弱 HashMap 如何知道对对象进行垃圾回收?

python - pyqt应用程序在cx_freeze打包后丢失图标

python - Scrapy:如何禁用或更改日志?

python - 如何在plotly choropleth map 中使用和阻止某个位置的特定颜色(python)

javascript - 已删除数组元素的垃圾收集

java - Java8 中的 GC 和停止 Web 服务的世界

java - 理解 GC G1 - 并发标记阶段