关闭文件而不引用它

时间:2014-10-30 09:32:20

标签: python file-io cpython pypy

在CPython中运行:

content = open('test', 'r').read()

不会使文件保持打开状态,因为文件对象在没有引用的情况下会自动进行垃圾回收(因此关闭)。

由于这是CPython的实现细节并依赖于引用计数,因此该代码将泄漏其他实现上的文件描述符,例如PyPy。

我的问题:有没有办法确保在不使用with语句或明确调用其close()方法的情况下关闭文件?

2 个答案:

答案 0 :(得分:0)

我要继续说不,不可能确保文件对象在没有引用的情况下被关闭。

答案 1 :(得分:0)

也许我不明白为什么你要避免使用with - 语句,但可能有助于定义一个函数来包装你的文件IO:

def read_data_from_file(fname):
    with open(fname) as f:
        return f.read()

很明显,它做了它应该做的事情,并且可以在列表理解中使用。

如果你想用“丢弃”文件句柄迭代这些行,为什么不引入这样的包装器(生成器)函数:

def iterate_lines_from_file(fname):
    with open(fname) as f:
        for line in f:
            yield line

它非常易于使用:

processed = [process_line(line) for line in iterate_lines_from_file("filename")]