在python中的子目录中创建文件

在python中的子目录中创建文件,python,file,python-2.x,Python,File,Python 2.x,我需要创建文件夹和文件,如下所示: 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) 假设我当前

我需要创建文件夹和文件,如下所示:

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)
假设我当前的工作目录名为“working_dir”

我需要创建->工作目录/my_文件夹/sub_文件夹/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作为第一点,如果您尝试创建文件夹而不考虑操作系统,那么我倾向于使用OS.path.join作为文件夹/文件路径:

导入操作系统 path=os.path.joinos.getcwd,'path','to','folder' 马克迪斯帕斯酒店 因为windows和*nix有不同的路径分隔符

Per:

超级mkdir;创建一个叶目录和所有中间目录。与mkdir类似,但如果不存在任何中间路径段,则将创建任何中间路径段,而不仅仅是最右边的路径段。这是递归的

使用openfile,“w”将创建一个文件,而不是文件夹。因此,您需要在打开文件之前保持makedirs调用。如果文件夹已存在,则需要捕获操作错误:

导入操作系统 folders=os.path。加入'some','folder' os.makedirsfolders os.makedirsfolders 回溯最近一次呼叫上次: 文件,第1行,在 makedirs中的文件/Users/mm92400/anaconda3/envs/27testenv/lib/python2.7/os.py,第157行 mkdirname,mode OSError:[Errno 17]文件存在:'some/文件夹' 因此,在您的生产代码中,如下所示:

尝试: os.makedirsfolders 除操作错误外: 做些日志记录 打印“文件夹已存在!” 最后,如果可以的话,我强烈建议您改用python3,python2将在今年年底结束。python3的实现更加简洁,因为它支持使用exist_ok标志:

超级mkdir;创建一个叶目录和所有中间目录。与mkdir类似,但如果不存在任何中间路径段,则将创建任何中间路径段,而不仅仅是最右边的路径段。如果目标目录已存在,请在存在时引发操作错误。\u确定为False。否则,不会引发异常。这是递归的

因此,您的代码将最终看起来像:

python3版本 导入操作系统 folders=os.path。加入'some','folder' os.makedirsfolders,存在\u ok=True os.makedirsfolders,存在\u ok=True 否定任何检查或try/except的需要,尽管try/except可以被视为更明确一点

从io导入打开 导入操作系统,json

def使_重复_路径自定义_路径: 尝试: os.makedirscustom_路径 返回真值 除操作错误外: 返回错误

我的_详细信息={ “姓名”:“约翰·多伊”, 年龄:29岁 }

mystrpath=我的文件夹/子文件夹

'定义路径以使其可读时,始终使用os.path函数。'

自定义路径=os.path.joinos.getcwd,mystrpath

def使_重复_路径自定义_路径: 尝试: os.makedirscustom_路径 返回真值 除操作错误外: 返回错误

如果使\u重复\u路径自定义\u路径: 使用openos.path.joincustom_path、'personal.json',mode=w,encoding=utf-8作为f_句柄: json.dumpmy\u详细信息,f\u句柄


我是mac用户,因此无法登录windows。请检查并让我知道这是否适用于您。

完全同意C.Nivs,注意如果不是os.path.exists“我的文件夹”:,您不应该这样做。在try:中包装您的调用,除了OSError等,并忽略它是否引发exists错误。这是避免制造种族冲突的唯一方法conditions@SedyVlk是的,是我自己发现的testing@C.Nivs谢谢,这很有帮助。将升级到python 3。如果您只是在学习基础知识,您可能应该忽略python 2,将时间花在当前推荐和支持的语言版本上,即python 3。您的代码有明显的缩进错误。它们看起来很琐碎,但请回顾一下。