Write file to a directory that doesn't exist in Python
Question:
How do I using with open() as f: ...
to write the file in a directory that doesn’t exist.
For example:
with open('/Users/bill/output/output-text.txt', 'w') as file_to_write:
file_to_write.write("{}n".format(result))
Let’s say the /Users/bill/output/
directory doesn’t exist. If the directory doesn’t exist just create the directory and write the file there.
Answers:
You need to first create the directory.
The mkdir -p
implementation from this answer will do just what you want. mkdir -p
will create any parent directories as required, and silently do nothing if it already exists.
Here I’ve implemented a safe_open_w()
method which calls mkdir_p
on the directory part of the path, before opening the file for writing:
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(...)
Updated for 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(...)
Make liberal use of the os
module:
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))
You can just create the path you want to create the file using 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
Source: this SO solution
Using pathlib.Path
(in Python 3.5 and up, to support the exist_ok
parameter):
from pathlib import Path
p = Path('Users') / 'bill' / 'output'
p.mkdir(exist_ok=True)
with (p / 'output-text.txt').open('w') as opened_file:
opened_file.write(...)
The answer given by Yakir Tsuberi is great but I would like to add that you need the parameter parents=True
for nested folders as explained here. Thus, the code would look as follows:
from pathlib import Path
p = Path('Users/bill/output')
p.mkdir(parents=True, exist_ok=True)
with (p / 'output-text.txt').open('w') as opened_file:
opened_file.write(...)
How do I using with open() as f: ...
to write the file in a directory that doesn’t exist.
For example:
with open('/Users/bill/output/output-text.txt', 'w') as file_to_write:
file_to_write.write("{}n".format(result))
Let’s say the /Users/bill/output/
directory doesn’t exist. If the directory doesn’t exist just create the directory and write the file there.
You need to first create the directory.
The mkdir -p
implementation from this answer will do just what you want. mkdir -p
will create any parent directories as required, and silently do nothing if it already exists.
Here I’ve implemented a safe_open_w()
method which calls mkdir_p
on the directory part of the path, before opening the file for writing:
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(...)
Updated for 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(...)
Make liberal use of the os
module:
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))
You can just create the path you want to create the file using 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
Source: this SO solution
Using pathlib.Path
(in Python 3.5 and up, to support the exist_ok
parameter):
from pathlib import Path
p = Path('Users') / 'bill' / 'output'
p.mkdir(exist_ok=True)
with (p / 'output-text.txt').open('w') as opened_file:
opened_file.write(...)
The answer given by Yakir Tsuberi is great but I would like to add that you need the parameter parents=True
for nested folders as explained here. Thus, the code would look as follows:
from pathlib import Path
p = Path('Users/bill/output')
p.mkdir(parents=True, exist_ok=True)
with (p / 'output-text.txt').open('w') as opened_file:
opened_file.write(...)