Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关闭没有引用的文件_Python_File Io_Cpython_Pypy - Fatal编程技术网

Python 关闭没有引用的文件

Python 关闭没有引用的文件,python,file-io,cpython,pypy,Python,File Io,Cpython,Pypy,在CPython中运行此命令: content = open('test', 'r').read() 不会使文件保持打开状态,因为当文件对象没有引用时,会自动对其进行垃圾收集(并因此关闭) 由于这是CPython的一个实现细节,并且依赖于引用计数,因此此代码将泄漏其他实现(如PyPy)上的文件描述符 我的问题是:有没有一种方法可以确保在不使用with语句或显式调用其close()方法的情况下关闭文件?我会继续说不,如果没有对文件对象的引用,就无法确保文件对象被关闭。也许我不明白为什么要避免使用

在CPython中运行此命令:

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')]
。当然,您可以使用
来实现这一点。