假设我想创建一个文件:
filename = "/foo/bar/baz.txt"
with open(filename, "w") as f:
f.write("FOOBAR")
这将给出一个IOError,因为/foo/bar不存在。
自动生成这些目录的最python化的方法是什么?是否有必要显式调用os。path。exists和os。Mkdir在每一个(即/foo,然后/foo/bar)?
假设我想创建一个文件:
filename = "/foo/bar/baz.txt"
with open(filename, "w") as f:
f.write("FOOBAR")
这将给出一个IOError,因为/foo/bar不存在。
自动生成这些目录的最python化的方法是什么?是否有必要显式调用os。path。exists和os。Mkdir在每一个(即/foo,然后/foo/bar)?
当前回答
在Python 3.2+中,使用OP请求的api,您可以优雅地执行以下操作:
import os
filename = "/foo/bar/baz.txt"
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
f.write("FOOBAR")
对于Pathlib模块(在Python 3.4中引入),有一种替代语法(感谢David258):
from pathlib import Path
output_file = Path("/foo/bar/baz.txt")
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text("FOOBAR")
在旧的python中,有一种不那么优雅的方式:
操作系统。Makedirs函数就是这样做的。试试下面的方法:
import os
import errno
filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
try:
os.makedirs(os.path.dirname(filename))
except OSError as exc: # Guard against race condition
if exc.errno != errno.EEXIST:
raise
with open(filename, "w") as f:
f.write("FOOBAR")
添加try-except块的原因是为了处理在os.path.exists和os.path.exists之间创建目录时的情况。发出呼叫,以保护我们不受竞态条件的影响。
其他回答
在Python 3.2+中,使用OP请求的api,您可以优雅地执行以下操作:
import os
filename = "/foo/bar/baz.txt"
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
f.write("FOOBAR")
对于Pathlib模块(在Python 3.4中引入),有一种替代语法(感谢David258):
from pathlib import Path
output_file = Path("/foo/bar/baz.txt")
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text("FOOBAR")
在旧的python中,有一种不那么优雅的方式:
操作系统。Makedirs函数就是这样做的。试试下面的方法:
import os
import errno
filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
try:
os.makedirs(os.path.dirname(filename))
except OSError as exc: # Guard against race condition
if exc.errno != errno.EEXIST:
raise
with open(filename, "w") as f:
f.write("FOOBAR")
添加try-except块的原因是为了处理在os.path.exists和os.path.exists之间创建目录时的情况。发出呼叫,以保护我们不受竞态条件的影响。