Python创建文件夹或目录

在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方式,可能这种方式更好些吧。

水平有限,如有错误,还望指正。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值