在 Python 中处理多个文件时如何避免嵌套“with”语句

2023-11-21

当使用推荐的样式在 Python 中处理多个文件时,代码可能会变得丑陋:

with open("foo.txt") as foo:
    with open("bar.txt", "w") as bar:
         with open("baz.txt", "w") as baz:
              # Read from foo, write different output to bar an baz

这是三个缩进级别,仅用于处理文件!另一种选择是这样的

foo = open("foo.txt")
bar = open("bar.txt", "w")
baz = open("baz.txt", "w")
# Read from foo, write different output to bar an baz
foo.close()
bar.close()
baz.close()

我有一种感觉,这两个例子都可以重构为更优雅的东西。有什么例子吗?


Python 2.7 及更高版本允许您在一个中指定多个上下文管理器with陈述:

with open("foo.txt") as foo, open("bar.txt", "w") as bar, open("baz.txt", "w") as baz:
    # Read from foo, write different output to bar an baz

线路does太长,并且不能使用括号将其保持在 80 个字符以下。您可以使用\然而反斜杠继续:

with open("foo.txt") as foo,\
        open("bar.txt", "w") as bar,\
        open("baz.txt", "w") as baz:
    # Read from foo, write different output to bar an baz

或者您可以将换行符放在“open()”调用的括号内:

with open(
    "foo.txt"
) as foo, open(
    "bar.txt", "w"
) as bar, open(
    "baz.txt", "w"
) as baz:
    # Read from foo, write different output to bar an baz

从 Python 3.10 开始,通过添加以下内容,这变得更加容易对多项目上下文管理器的括号支持:

with (
    open("foo.txt") as foo,
    open("bar.txt", "w") as bar,
    open("baz.txt", "w") as baz,
):
    # Read from foo, write different output to bar an baz

另一种选择是使用contextlib.ExitStack()上下文管理器(仅适用于 Python 3.3 及更高版本):

from contextlib import ExitStack

with ExitStack() as stack:
    foo = stack.enter_context(open("foo.txt"))
    bar = stack.enter_context(open("bar.txt"))
    baz = stack.enter_context(open("baz.txt"))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中处理多个文件时如何避免嵌套“with”语句 的相关文章

随机推荐

  • Visual Studio 可以像 app.config 一样自动调整其他文件的名称吗?

    将应用程序配置文件添加到 Visual Studio 中的 Net 项目时 它将被命名为app config并将被重命名 在构建时 为ApplicationName config 我有一个包含大约 40 个项目的解决方案 我想为其中一些添加
  • 从列表中删除重复的元素

    我有一个list of character vectors my list lt list e1 c a b c k e2 c b d e e3 c t d g a f 我正在寻找一个function对于任何character出现不止一次l
  • 将数据从 firestore 导入 bigQuery

    我已将我的帐户升级为 blaze 这是先决条件之一 我尝试遵循FAQ将 BigQuery 链接到 Firebase 仍然无法看到从 firestore 或 firebase realtimeDatabase 到 bigQuery 的任何数据
  • aws sns 确认订阅请求处理问题

    我正在尝试为 s3 中的存储桶实现 aws sns 服务 并且我正在关注此文档https docs aws amazon com sns latest dg SendMessageToHttp html据此 确认订阅的请求中将有订阅 url
  • Java中的单继承作弊?

    我听说有一种方法可以欺骗单继承并在Java中实现多重继承 有谁知道如何实现这个 不使用接口 只是出于好奇 当然可以 但这很棘手 您应该认真考虑这是否是您想要的方式 这个想法是使用基于范围的继承和基于类型的继承 这是类型对话 表示出于内部目的
  • jquery ui sortables 连接列表:复制项目

    我有两个列表 我希望它们都可以排序 并且希望能够将项目从 list1 复制 拖动 到 list2 反之亦然 http jqueryui com demos sortable connect lists 是我想要的 但项目被移动 而不是复制
  • 圆-矩形碰撞检测(交叉点)

    如何判断圆形和矩形在二维欧几里得空间中是否相交 即经典的二维几何 我将这样做 bool intersects CircleType circle RectType rect circleDistance x abs circle x rec
  • 如何使用 PHP 将文件从服务器复制到 Dropbox? [复制]

    这个问题在这里已经有答案了 我想我可能找到了一个 PHP 程序 可以将特定文件夹中的文件上传到我的 Dropbox 帐户 完整的解决方案可以找到here 该代码似乎有效 因为正在上传类似的文件和文件夹 但是 我不希望预先压缩服务器上的文件
  • 仅使用 javascript 列出目录中的文件

    是否可以仅使用 javascript 列出目录中的文件 为了澄清 我的意思是列出服务器上的文件 而不是客户端计算机上的文件 例如 www domain com files 包含 4 张图片 jpg 我可以创建一个额外的页面 www doma
  • 在 RMarkdown 中缩进而不添加项目符号点或数字

    我想制作一个缩进列表 但我不希望它有要点或数字 我在 RStudio 中使用 Rmarkdown 并编织为 html bla bla bla Example indented line with bullet point Another i
  • 使用来自多个点的多个图像构建 3D 模型 (kinect)

    如果从不同角度收集各种图像和深度数据 是否可以构建静止物体的 3D 模型 我的想法是有一种圆形传送带 其中将放置 kinect 并且传送带同时要在 3D 空间中重建的真实物体位于中间 此后传送带围绕图像旋转一圈 并捕获大量图像 可能每秒 1
  • python numpy 机器 epsilon

    我想了解什么是机器 epsilon 根据维基百科 可以计算如下 def machineEpsilon func float machine epsilon func 1 while func 1 func machine epsilon f
  • Java 6 源代码向后兼容性和 SQL

    我的理解是 为了保持源兼容性 Java 永远不会向公共接口引入新方法 因为这会破坏实现接口的现有客户端 Java 发行说明 states 一般来说 政策如下 除了任何不兼容的情况 进一步列出如下 维护版本 例如 1 4 1 1 4 2 不引
  • jQuery .attr("disabled", "disabled") 在 Chrome 中不起作用

    不知道为什么这不起作用 当人们单击我的应用程序的 编辑 按钮时 禁用的文本字段将变为可编辑 bewerken click function e input disabled disabled removeAttr disabled 然后 我
  • 如何修复错误; “错误:Bootstrap 工具提示需要 Tether (http://github.hubspot.com/tether/)”

    我正在使用 Bootstrap V4 控制台中记录了以下错误 错误 Bootstrap 工具提示需要 Tether http github hubspot com tether 我尝试通过安装 Tether 来消除该错误 但没有成功 我通过
  • 进度条与 asyncTask 一起使用

    我想在屏幕上使用进度条而不是进度对话框 我在 XML 视图文件上插入了一个进度条 我想让它在加载时显示 在不加载时禁用它 所以我使用的是可见的 但它发生了 所以其余的数据下降了 我应该如何在异步任务中使用进度条 我怎样才能显示和隐藏它 这是
  • Android 实时开发者通知一次性购买成功了一半

    当我使用 慢速测试卡 几分钟后批准 时 Android 的实时开发人员通知会起作用 我通过 pub sub 在我的服务器上收到两个通知 一种是当购买已完成并且其中包含令牌和订单时的消费状态 0 时 第二个通知 在它被消费后 带有 token
  • 导入错误:没有名为 lxml.etree 的模块

    我正在尝试在我的项目中导入预邮件程序 但它在 etree 导入中始终失败 我安装了 lxml 的 2 7 二进制文件 lxml 模块导入正常 如果我记录 lxml 模块 它会显示库文件夹的正确路径 但我无法从中导入 etree lxml 文
  • Java从文本文件中读取值

    我是 Java 新手 我有一个包含以下内容的文本文件 trace structure list a structure c 0 748701 0 243802 0 227221 0 752231 0 261118 0 263976 1 19
  • 在 Python 中处理多个文件时如何避免嵌套“with”语句

    当使用推荐的样式在 Python 中处理多个文件时 代码可能会变得丑陋 with open foo txt as foo with open bar txt w as bar with open baz txt w as baz Read