Python 关闭没有引用的文件
在CPython中运行此命令:Python 关闭没有引用的文件,python,file-io,cpython,pypy,Python,File Io,Cpython,Pypy,在CPython中运行此命令: content = open('test', 'r').read() 不会使文件保持打开状态,因为当文件对象没有引用时,会自动对其进行垃圾收集(并因此关闭) 由于这是CPython的一个实现细节,并且依赖于引用计数,因此此代码将泄漏其他实现(如PyPy)上的文件描述符 我的问题是:有没有一种方法可以确保在不使用with语句或显式调用其close()方法的情况下关闭文件?我会继续说不,如果没有对文件对象的引用,就无法确保文件对象被关闭。也许我不明白为什么要避免使用
content = open('test', 'r').read()
不会使文件保持打开状态,因为当文件对象没有引用时,会自动对其进行垃圾收集(并因此关闭)
由于这是CPython的一个实现细节,并且依赖于引用计数,因此此代码将泄漏其他实现(如PyPy)上的文件描述符
我的问题是:有没有一种方法可以确保在不使用
with
语句或显式调用其close()
方法的情况下关闭文件?我会继续说不,如果没有对文件对象的引用,就无法确保文件对象被关闭。也许我不明白为什么要避免使用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")]
你的问题就像“如何不用汤匙喝汤”。你能解释一下你不能将
与
一起使用或关闭
的原因吗?这更像是“我可以不用勺子喝汤吗?”。当然,我可以使用它们,我只是好奇,如果我希望我的代码在非CPython上运行时是正确的,我是否必须这样做。例如,在一个循环理解中完成所有文件操作有一定的优雅性,这在eg PyPy中似乎是不可能的。当然,你也可以不用勺子喝汤。在垃圾收集或程序终止时,文件最终将在PyPy中关闭。您是否正在寻找一种更及时、更确定的方法来确保关闭您的文件?是的。类似于contextlib
的closing
方法,我想。我正在寻找一种确保文件已关闭的内置方法。我的用例是迭代一个打开的(文件'r')
,而不保留对文件对象的引用。在CPython的小方法中使用时没有问题,但它会在其他实现中泄漏文件描述符。@RomanLevin您能否澄清一下您是如何实现迭代的,它禁止您将与
stmt一起使用?例如lines=[line For line in open('file','r')]
。当然,您可以使用和来实现这一点。