0

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

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

下面是我的两个问题:

  1. 如何一次创建两级目录。我的意思是使用 makedirs 语法,如何创建 /my_folder/sub_folder。

  2. 有必要使用makedirs语法吗?我不能直接在“with open....”语句中创建目录吗?如果我从上面删除 makedirs 语句,则会出现错误,即如果文件夹不存在,则不会创建文件夹,因此不会创建文件。

请注意,无论操作系统如何,该脚本都应该可以工作。另外,我正在使用 python 2.7.12

4

2 回答 2

1

对于您的第一点,如果您尝试创建与操作系统无关的文件夹,那么我倾向于使用os.path.join文件夹/文件路径:

import os

path = os.path.join(os.getcwd(), 'path', 'to', 'folder')
os.makedirs(path)

由于 windows 和 *nix 有不同的路径分隔符。

根据文档

超级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标志:

超级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可以将其视为更明确一点

于 2019-12-10T20:02:28.840 回答
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。请检查并让我知道这是否适合你。

于 2019-12-10T20:37:32.143 回答