在打开文件进行写入之前递归创建目录

2024-01-07

我需要写入一个文件(截断),并且它本身所在的路径可能不存在)。例如,我想写信给/tmp/a/b/c/config, but /tmp/a本身可能不存在。然后,open('/tmp/a/b/c/config', 'w')显然,这是行不通的,因为它没有创建必要的目录。但是,我可以使用以下代码:

import os

config_value = 'Foo=Bar'  # Temporary placeholder

config_dir = '/tmp/a/b/c'  # Temporary placeholder
config_file_path = os.path.join(config_dir, 'config')

if not os.path.exists(config_dir):
    os.makedirs(config_dir)

with open(config_file_path, 'w') as f:
    f.write(config_value)

有没有更Pythonic的方法来做到这一点?很高兴知道 Python 2.x 和 Python 3.x(尽管由于依赖性原因,我在代码中使用了 2.x)。


如果您在多个地方重复此模式,您可以创建自己的上下文管理器来扩展open()和过载__enter__():

import os

class OpenCreateDirs(open):
    def __enter__(self, filename, *args, **kwargs):
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)

        super(OpenCreateDirs, self).__enter__(filename, *args, **kwargs)

那么你的代码就变成了:

import os

config_value = 'Foo=Bar'  # Temporary placeholder
config_file_path = os.path.join('/tmp/a/b/c', 'config')

with OpenCreateDirs(config_file_path, 'w') as f:
    f.write(config_value)

运行时调用的第一个方法with open(...) as f: is open.__enter__()。因此,通过在调用之前创建目录super(...).__enter__(),您在尝试打开文件之前创建目录。

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

在打开文件进行写入之前递归创建目录 的相关文章

随机推荐

  • 继续出现此编译错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我编译时 我不断收到此错误 mario c 4 1 error expected identifier or 我尝试过改变一些东
  • .htaccess - 将域/lang/重定向到每种语言的子域

    我已经为此苦苦挣扎了好几个星期 但无法找到解决方案 我必须在多语言网站的 htaccess 中进行重定向 其所有页面都遵循相同的结构 但每种语言都有一个子域 以下方式对 http 和 https 有效 domain es es allpag
  • gcc -D_FORTIFY_SOURCE=1 和 -D_FORTIFY_SOURCE=2 之间的区别

    有人可以指出两者之间的区别吗gcc D FORTIFY SOURCE 1 and D FORTIFY SOURCE 2 我猜 2更安全吗 我无法找到逐点列出差异的列表 我也读过 D FORTIFY SOURCE 2应该与使用 O2 否则并非
  • 如何从 Scala 方法创建 UDF(计算 md5)?

    我想从两个已经工作的函数构建一个 UDF 我正在尝试计算 md5 哈希作为现有 Spark Dataframe 的新列 def md5 s String String toHex MessageDigest getInstance MD5
  • JavaScript 字符串按正则表达式结果分割子字符串包含空切片

    我有以下字符串分割 JavaScript 代码 var formula field1 field2 field5 field2 field3 console log formula split 而结果却出乎意料 field1 field2
  • QFileSystemModel rowCount 未按预期工作

    我正在尝试模型 视图编程中的一个示例 http doc qt io qt 5 model view programming html http doc qt io qt 5 model view programming html 为了演示如
  • 如何确定docker容器端口号?

    ASP NET 应用程序部署到 Docker 容器 即 可以通过以下方式访问 http 10 98 1 191 1673 webapp start http 10 98 1 191 1673 webapp start 从后端来看 我需要确定
  • 如何使用多个输入的任何循环指定输入目录?

    public class MultiXslt public static void main String args throws TransformerException ParserConfigurationException SAXE
  • 手机上的 Silverlight 网站

    我正在开发一个 Silverlight 网站 功能要求之一是旋转图像在所有浏览器上显示 该测试站点在所有桌面计算机浏览器中看起来都很棒 现在的问题是手机上的系统无法加载 我无法理解 iPhone 黑莓等设备上没有插件 但我的问题是在 Mic
  • PyScripter Rpyc

    也许有人可以给我一些如何将 Rpyc 安装到 PyScripter 的指南 我使用 PyScripter 1 9 9 7 和 Python 2 6 我尝试用谷歌搜索并找到一些说明 但仍然没有成功 Thanks 抓取文件rpyc 2 60 p
  • 如何获取树视图中的所有展开节点?

    我有一个包含 TreeView 的程序 除了根节点和根节点下的两个节点之外 我的所有节点都是从数据库加载的 当用户将数据添加到数据库时 它必须自动添加到 TreeView 我可以通过清除所有节点 添加默认节点并将所有数据 包括新节点 添加到
  • 意外的状态行:ICY 200 对于 URL openStream() 方法可以吗?

    根据 kitakt 4 4 的更改 播放 Shoutcast 流会出现一些问题 那些返回 ICY 而不是 HTTP 1 x 响应的问题 因此 kitkat 的解决方案是在我们打开流之前在 JVM 中重新注册一次 icy 协议前缀 try j
  • OCaml 中的“[< >]”是什么意思?

    我看过一些源代码 let rec parse document parser lt len parse int32 st gt gt parse list ES take int32 len st lt gt gt malformed pa
  • C# WPF 中的 TextRange 和 RichTextBox

    我一直在尝试编写一个程序来在 richTextBox 中搜索单词 我已经完成了大部分 但看起来我错过了一些东西 我想为找到的单词着色 所以我写了以下内容 private void button1 Click object sender Ro
  • 捕获linux中的所有信号

    我正在尝试在 C linux 中编写一个进程 该进程忽略 SIGINT 和 SIGQUIT 信号并退出 SIGTERM 对于其他信号 它应该写出信号和时间 我无法捕获所有信号 因为我只熟悉捕获 1 个信号 如果有人能帮助我 我将非常感激 这
  • 如何在 Android 上执行 USSD 请求?

    一些自定义拨号器应用程序 例如 MotoBlur 的拨号器 能够执行 USSD 请求 通过SDK真的不可能做到这一点吗 API26中添加了ussd api 因此 由于 Oreo 与 ussd 的配合看起来像这样 TelephonyManag
  • 如何在chrome中使用video.js播放flash(.flv)视频

    我在用video js播放 flash flv 视频 但是当我按播放按钮时它不播放视频 我已经用过 techorder flash html 但这没有什么区别 有没有可以播放flash视频的插件videojs 如何播放 flv 视频vide
  • 如何使用mvc创建Windows应用程序

    hii 是否可以使用 mvc 创建 Windows 应用程序 MVP 模型 视图 呈现器 和 MVP VM 模型 视图 呈现器 视图模型 最常与 WinForms 一起使用 请参阅SO问题 Windows 窗体的 MVP 示例 https
  • 所有浏览器和设备的图标/启动屏幕[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道我是否已涵盖所有浏览器和设备的所有图标 启动画面 这够了吗 或者我应该涵盖哪些主要内容 我是否缺少以下内容
  • 在打开文件进行写入之前递归创建目录

    我需要写入一个文件 截断 并且它本身所在的路径可能不存在 例如 我想写信给 tmp a b c config but tmp a本身可能不存在 然后 open tmp a b c config w 显然 这是行不通的 因为它没有创建必要的目