在python中创建文件夹或目录有两种方式:
一、os.mkdir
os.mkdir
只能创建叶子目录,比如有已存在的目录\user
,os.mkdir
只能在user下创建文件夹,而不能创建中间目录,如\user\ubuntu(不存在)\test
。
判断是否是文件夹,可以用os.path.isdir
比如我user目录如下:
-rw-r--r-- 1 T005 197121 0 10月 12 10:55 f1
drwxr-xr-x 1 T005 197121 0 10月 12 10:55 t1
drwxr-xr-x 1 T005 197121 0 10月 12 10:55 t2
可以看到有t1, t2两个文件夹和f1一个文件,
使用os.path.isdir(‘d1’)看是否是目录:
In [70]: os.path.isdir('user/d5')
Out[70]: False
In [71]: os.path.isdir('user/f1')
Out[71]: False
In [72]: os.path.isdir('user/t1')
Out[72]: True
In [73]: os.path.isdir('user/t1')
Out[73]: True
可以看到对于不存在的文件夹也不会产生异常。如此,当我们在文件夹不存在时创建可以用:
if not os.path.isdir('user/f1'):
os.mkdir('user/f1')
发现报错FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'user/f1'
,f1已存在,也就是说,文件和文件夹也不能重名,故,我们使用os.path.exists('name')
来判断是否存在文件或目录:
if not os.path.exists('user/f1'):
os.mkdir('user/f1')
没有异常。换一个不存在的文件:
In [81]: if not os.path.exists('user/f2'):
...: os.mkdir('user/f2')
...:
In [82]: os.system('ls user/')
f1 f2 t1 t2
Out[82]: 0
也可以直接使用异常处理:
try:
os.mkdir('user/f2')
except FileExistsError:
pass
这里存在一个问题,就是当要创建的文件夹与已存在文件重名时,虽没有抛出异常,但并没有相应的文件夹存在。所以最好还是针对性处理一下:
if os.path.exists(name):
if not os.path.isdir(name):
当存在文件f2时的处理语句
else:
os.mkdir(name)
用异常改写:
try:
os.mkdir(name)
except FileExistsError:
if not os.path.isdir(name):
处理语句
二、os.makedirs
os.makedirs
是升级版的os.mkdir
。区别在于它可以创建中间目录,去看源码,makedirs
就是采用递归的方式将传入的name拆分并使用mkdir
创建:
In [2]: os.system('tree')
卷 DATA1 的文件夹 PATH 列表
卷序列号为 FED8-A57F
D:.
├─f2
├─t1
└─t2
Out[2]: 0
In [3]: os.makedirs('p0/p1/p2/p3')
In [4]: os.system('tree')
卷 DATA1 的文件夹 PATH 列表
卷序列号为 FED8-A57F
D:.
├─f2
├─p0
│ └─p1
│ └─p2
│ └─p3
├─t1
└─t2
Out[4]: 0
同时,makedirs
的原型为makedirs(name, mode=511, exist_ok=False)
,当exist_ok为True时,即便存在同名文件夹也不会抛出异常:
In [5]: os.makedirs('p0')
---------------------------------------------------------------------------
FileExistsError Traceback (most recent call last)
<ipython-input-5-8e42a4b86211> in <module>
----> 1 os.makedirs('p0')
d:\conda\lib\os.py in makedirs(name, mode, exist_ok)
219 return
220 try:
--> 221 mkdir(name, mode)
222 except OSError:
223 # Cannot rely on checking for EEXIST, since the operating system
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'p0'
In [6]: os.makedirs('p0', exist_ok=True)
In [7]:
但如果存在同名文件(f1是一个文件):
In [8]: os.makedirs('f1', exist_ok=True)
---------------------------------------------------------------------------
FileExistsError Traceback (most recent call last)
<ipython-input-8-1b397b609f26> in <module>
----> 1 os.makedirs('f1', exist_ok=True)
d:\conda\lib\os.py in makedirs(name, mode, exist_ok)
219 return
220 try:
--> 221 mkdir(name, mode)
222 except OSError:
223 # Cannot rely on checking for EEXIST, since the operating system
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'f1'
这时就要另外处理了。
后记:
初衷是想起之前看过的两种流程,一种是先判断,如之前的先判断是否存在再创建,另一种时直接用异常处理。想找找哪种方式更好一些。没找到,但刚刚发现os.py里针对文件已存在的处理就是用的try-except方式,可能这种方式更好些吧。