python - 一次打开多个(未指定数量)文件并确保它们正确关闭

标签 python exception python-3.x with-statement

我知道我可以打开多个文件,例如,

with open('a', 'rb') as a, open('b', 'rb') as b:

但我有一种情况,我有一个要打开的文件列表,我想知道当文件数量事先未知时,做同样事情的首选方法是什么。类似的,

with [ open(f, 'rb') for f in files ] as fs:

(但由于列表没有实现 __exit__,因此失败并出现 AttributeError)

我不介意使用类似的东西,

try:
    fs = [ open(f, 'rb') for f in files ]

    ....

finally:
    for f in fs:
        f.close()

但我不确定如果在尝试打开某些文件时抛出一些文件会发生什么。 fs 是否会在 finally block 中正确定义,以及确实设法打开的文件?

最佳答案

不,您的代码不会初始化 fs,除非所有 open() 调用都成功完成。不过这应该可行:

fs = []
try:
    for f in files:
        fs.append(open(f, 'rb'))

    ....

finally:
    for f in fs:
        f.close()

还要注意 f.close() 可能会失败,因此您可能想要捕获并忽略(或以其他方式处理)那里的任何失败。

关于python - 一次打开多个(未指定数量)文件并确保它们正确关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7945182/

相关文章:

python - 发送 GET 请求以进行 Google 反向图像搜索

python - 在 python 函数中使用 *args 和初始化参数的正确方法

python - 如何在odoo中使用onchange one2many变量传递值?

python - 引发 Exception 类和 Exception 实例之间有区别吗?

python - 将文本转换为 numpy 数组

python - 操作顺序不正确?

python - 连接两个范围函数结果

python - 使用 Python 正则表达式解析时间戳 ':' 未找到字符

python-3.x - 使用 python 3.6 和 beautifulsoup 进行网络抓取 - 获取无效的 URL

c++ - 异常的生命周期是否受到其他异常的影响?