在python的子目录中创建文件

时间:2019-12-10 19:53:12

标签: python file python-2.x

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

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

2 个答案:

答案 0 :(得分:1)

首先,如果您尝试创建文件夹而不考虑操作系统,那么我倾向于使用os.path.join作为文件夹/文件路径:

import os

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

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

the documentation

  

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中签入。请检查并告知我是否适合您。