Записать файл в каталог, который не существует

Как использовать 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/ не существует. Если каталог не существует, просто создайте каталог и напишите там файл.

Ответ 1

Вам нужно сначала создать каталог.

Реализация mkdir -p из этого ответа будет делать именно то, что вы хотите. 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(...)

Ответ 2

Сделайте либеральное использование модуля 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))

Ответ 3

Вы можете просто создать путь, который хотите создать файл, используя 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 solution

Ответ 4

Для 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(...)