我需要创建以下文件夹和文件:
假设我当前的工作目录为“ working_dir”
我需要创建-> working_dir / my_folder / sub_folder / new_file.json
我可以在子目录中创建文件,如下所示:
import json
import os
my_details = {
'name': 'John Doe',
'age': 29
}
if not os.path.exists('my_folder'):
os.makedirs('my_folder')
with open('my_folder/personal.json', 'w') as json_file:
json.dump(my_details, json_file)
以下是我的两个问题:
如何一次性创建两个级别的目录。我的意思是使用makedirs语法,如何创建/ my_folder / sub_folder。
是否需要使用makedirs
语法?我不能直接在语句“ with open ....”中创建目录。如果我从上面删除makedirs语句,则会收到一个错误消息,即如果该文件夹尚不存在,那么它不会创建该文件夹,因此不会创建该文件。
请注意,无论操作系统如何,该脚本均应正常工作。另外,我正在使用python 2.7.12
答案 0 :(得分:1)
首先,如果您尝试创建文件夹而不考虑操作系统,那么我倾向于使用os.path.join
作为文件夹/文件路径:
import os
path = os.path.join(os.getcwd(), 'path', 'to', 'folder')
os.makedirs(path)
由于Windows和* nix具有不同的路径分隔符。
Super-mkdir;创建一个叶子目录和所有中间目录。像mkdir一样工作,除了如果不存在任何中间路径段(不仅是最右边的),它将创建。这是递归的。
with open(file, 'w')
将创建一个文件,而不是一个文件夹。因此,在打开文件之前,您需要保持makedirs调用。如果文件夹已经存在,则需要捕获OSError
:
import os
folders = os.path.join('some', 'folder')
os.makedirs(folders)
os.makedirs(folders)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mm92400/anaconda3/envs/27testenv/lib/python2.7/os.py", line 157, in makedirs
mkdir(name, mode)
OSError: [Errno 17] File exists: 'some/folder'
因此,在您的生产代码中,这看起来像:
try:
os.makedirs(folders)
except OSError:
# do some logging
print('folder exists!')
最后,我会强烈建议,如果可以的话,请切换到python3,python2将于今年年底到期。 python3的实现更加简洁,因为它可以使用exist_ok
标志:
Super-mkdir;创建一个叶子目录和所有中间目录。像mkdir一样工作,除了如果不存在任何中间路径段(不仅是最右边的),它将创建。如果目标目录已经存在,并且如果exist_ok为False,则引发OSError。否则,不会引发异常。这是递归的。
所以您的代码看起来像这样:
# python3 version
import os
folders = os.path.join('some', 'folder')
os.makedirs(folders, exist_ok=True)
os.makedirs(folders, exist_ok=True)
尽管try/except
可能看起来更明确了,但是却不需要进行任何检查或try/except
答案 1 :(得分:0)
from io import open
import os,json
def make_recur_path(custom_path):
try:
os.makedirs(custom_path)
return True
except OSError:
return False
my_details = {
'name': 'John Doe',
'age': 29
}
mystrpath="my_folder/sub_folder"
''' Always use os.path functions when you define a path to make it readable.'''
custom_path=os.path.join(os.getcwd(), mystrpath)
def make_recur_path(custom_path):
try:
os.makedirs(custom_path)
return True
except OSError:
return False
if make_recur_path(custom_path):
with open(os.path.join(custom_path,'personal.json'),mode="w", encoding="utf-8") as f_handle:
json.dump(my_details,f_handle)
我是Mac用户,所以我无法在Windows中签入。请检查并告知我是否适合您。