在CPython中运行:
content = open('test', 'r').read()
不会使文件保持打开状态,因为文件对象在没有引用的情况下会自动进行垃圾回收(因此关闭)。
由于这是CPython的实现细节并依赖于引用计数,因此该代码将泄漏其他实现上的文件描述符,例如PyPy。
我的问题:有没有办法确保在不使用with
语句或明确调用其close()
方法的情况下关闭文件?
答案 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")]