【问题标题】:Write file to a directory that doesn't exist将文件写入不存在的目录
【发布时间】:2014-07-10 17:35:42
【问题描述】:

如何使用with open() as f: ...将文件写入不存在的目录中。

例如:

with open('/Users/bill/output/output-text.txt', 'w') as file_to_write:
    file_to_write.write("{}\n".format(result))

假设/Users/bill/output/ 目录不存在。如果目录不存在,只需创建目录并将文件写入那里。

【问题讨论】:

标签: python


【解决方案1】:

Yakir Tsuberi 给出的答案很好,但我想补充一点,您需要嵌套文件夹的参数“parents=True”,如here 所述。因此,代码如下所示:

from pathlib import Path

p = Path('Users/bill/output')
p.mkdir(parents=True,exist_ok=True)
(p / 'output-text.txt').open('w').write(...)

【讨论】:

  • 这里有一个语法错误,正如@ZeitPolizei 在他的评论中提到的那样。请将路径分配代码行更改为Path('Users/bill/output') ?
【解决方案2】:

你需要先创建目录。

mkdir -p 实现 from this answer 会做你想做的事。 mkdir -p 将根据需要创建任何父目录,如果它已经存在,则不执行任何操作。

这里我实现了一个safe_open_w() 方法,它在路径的目录部分调用mkdir_p,然后打开文件进行写入:

import os, os.path
import errno

# Taken from https://stackoverflow.com/a/600612/119527
def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc: # Python >2.5
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else: raise

def safe_open_w(path):
    ''' Open "path" for writing, creating any parent directories as needed.
    '''
    mkdir_p(os.path.dirname(path))
    return open(path, 'w')

with safe_open_w('/Users/bill/output/output-text.txt') as f:
    f.write(...)

为 Python 3 更新:

import os, os.path

def safe_open_w(path):
    ''' Open "path" for writing, creating any parent directories as needed.
    '''
    os.makedirs(os.path.dirname(path), exist_ok=True)
    return open(path, 'w')

with safe_open_w('/Users/bill/output/output-text.txt') as f:
    f.write(...)

【讨论】:

  • 这是一个很好的答案。为澄清起见,您的代码中使用的mkdir_p 函数也必须使用提供的链接进行定义。它不随 Python 提供。
  • @HuuNguyen 添加了说明,谢谢。仍然不确定为什么有人对此投反对票。
  • 对于exc.errno == errno.EEXIST 我得到了错误:NameError: global name 'errno' is not defined。将其更改为 exc.errno == 17 有效。
  • @Jacob 你需要import errno
  • 现在,您可以通过将exists_ok=True 传递给os.makedirs 来避免错误处理
【解决方案3】:

对于 Python 3 可以使用 pathlib.Path:

from pathlib import Path

p = Path('Users'/'bill'/'output')
p.mkdir(exist_ok=True)
(p / 'output-text.txt').open('w').write(...)

【讨论】:

  • 这应该是2020年公认的答案,不用再纠结自定义函数和os模块了。
  • 在 W10 中根本无法正常工作(使用 WindowsPath)...
  • 这里有语法错误。它应该是Path('Users/bill/output')Path('Users') / 'bill' / 'output'
【解决方案4】:

你可以create使用os.makedirs创建文件的路径:

import os
import errno

def make_dir(path):
    try:
        os.makedirs(path, exist_ok=True)  # Python>3.2
    except TypeError:
        try:
            os.makedirs(path)
        except OSError as exc: # Python >2.5
            if exc.errno == errno.EEXIST and os.path.isdir(path):
                pass
            else: raise

来源:this SO 解决方案

【讨论】:

    【解决方案5】:

    充分利用os 模块:

    import os
    
    if not os.path.isdir('/Users/bill/output'):
        os.mkdir('/Users/bill/output')
    
    with open('/Users/bill/output/output-text.txt', 'w') as file_to_write:
        file_to_write.write("{}\n".format(result))
    

    【讨论】:

    • 这也不处理中间目录的制作。
    • 当然不是,这是我的一个完整假设。我认为/Users/bill 存在。
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-01-19
    • 2022-07-13
    • 1970-01-01
    • 2016-11-25
    • 2018-01-01
    相关资源
    最近更新 更多