在 python 的子目录中创建文件
Create a file within a subdirectory in python
我需要创建如下文件夹和文件:
假设我当前的工作目录名为 '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 语句,我会收到一个错误,即如果文件夹不存在,它不会创建该文件夹,因此不会创建文件。
请注意,无论 OS 是什么,脚本都应该可以正常工作。另外,我正在使用 python 2.7.12
关于你的第一点,如果你试图创建文件夹而不考虑 OS,那么我倾向于使用 os.path.join
作为 folder/file 路径:
import os
path = os.path.join(os.getcwd(), 'path', 'to', 'folder')
os.makedirs(path)
因为 windows 和 *nix 有不同的路径分隔符。
Super-mkdir; create a leaf directory and all intermediate ones. Works like mkdir, except that any intermediate path segment (not just the rightmost) will be created if it does not exist. This is recursive.
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; create a leaf directory and all intermediate ones. Works like mkdir, except that any intermediate path segment (not just the rightmost) will be created if it does not exist. If the target directory already exists, raise an OSError if exist_ok is False. Otherwise no exception is raised. This is recursive.
因此您的代码最终将如下所示:
# 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
可以被视为更明确一些
从 io 导入打开
导入 os,json</p>
<p>def make_recur_path(custom_path):
尝试:
os.makedirs(custom_path)
return 正确
除了操作系统错误:
return 错 </p>
<p>my_details = {
'name': 'John Doe',
'age': 29
}</p>
<p>mystrpath="my_folder/sub_folder"</p>
<p>''' 在定义路径以使其可读时始终使用 os.path 函数。'''</p>
<p>custom_path=os.path.join(os.getcwd(), mystrpath)</p>
<p>def make_recur_path(custom_path):
尝试:
os.makedirs(custom_path)
return 正确
除了操作系统错误:
return 错 </p>
<p>如果make_recur_path(custom_path):
打开(os.path.join(custom_path,'personal.json'),mode="w", encoding="utf-8") 作为f_handle:
json.dump(my_details,f_handle)</p>
<p>
我是 mac 用户,所以我无法登记 windows.Please 请检查并告诉我这是否适合你。
我需要创建如下文件夹和文件:
假设我当前的工作目录名为 '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 语句,我会收到一个错误,即如果文件夹不存在,它不会创建该文件夹,因此不会创建文件。
请注意,无论 OS 是什么,脚本都应该可以正常工作。另外,我正在使用 python 2.7.12
关于你的第一点,如果你试图创建文件夹而不考虑 OS,那么我倾向于使用 os.path.join
作为 folder/file 路径:
import os
path = os.path.join(os.getcwd(), 'path', 'to', 'folder')
os.makedirs(path)
因为 windows 和 *nix 有不同的路径分隔符。
Super-mkdir; create a leaf directory and all intermediate ones. Works like mkdir, except that any intermediate path segment (not just the rightmost) will be created if it does not exist. This is recursive.
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; create a leaf directory and all intermediate ones. Works like mkdir, except that any intermediate path segment (not just the rightmost) will be created if it does not exist. If the target directory already exists, raise an OSError if exist_ok is False. Otherwise no exception is raised. This is recursive.
因此您的代码最终将如下所示:
# 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
可以被视为更明确一些
从 io 导入打开
导入 os,json</p>
<p>def make_recur_path(custom_path):
尝试:
os.makedirs(custom_path)
return 正确
除了操作系统错误:
return 错 </p>
<p>my_details = {
'name': 'John Doe',
'age': 29
}</p>
<p>mystrpath="my_folder/sub_folder"</p>
<p>''' 在定义路径以使其可读时始终使用 os.path 函数。'''</p>
<p>custom_path=os.path.join(os.getcwd(), mystrpath)</p>
<p>def make_recur_path(custom_path):
尝试:
os.makedirs(custom_path)
return 正确
除了操作系统错误:
return 错 </p>
<p>如果make_recur_path(custom_path):
打开(os.path.join(custom_path,'personal.json'),mode="w", encoding="utf-8") 作为f_handle:
json.dump(my_details,f_handle)</p>
<p>
我是 mac 用户,所以我无法登记 windows.Please 请检查并告诉我这是否适合你。