我使用Python,很多时候是用Python写一些文件或者目录的处理脚本。正是出于这个原因,很多时候我会用到os模块。我使用os模块,有时候还会出于另外一个原因,那就是直接使用system方法去调用现在系统中已经存在的命令或者功能。
最近写一个小脚本的时候一个抛出的异常突然间给了我一点提醒,或许有些方法还是值得改进的。我在写一个目录归档备份的小脚本,在初期的测试过程中,遇到了拷贝失败的情况。因为我对脚本进行反复运行测试的时候,出现了待备份文件已经在目标位置存在的情况。有意思的是抛出的异常中有一个提示是说不能够mkdir目录,一看这个mkdir词眼儿我熟悉,但是一回神儿觉得不对劲儿,因为此时我压根儿没有调用系统中的任何功能。一瞬间觉得,似乎这个方法在Python中是存在的。搜了一下帮助手册,果真如此,我还傻乎乎使用system调用系统功能这么久。好的是mkdir在各个操作系统上还都是存在的。
说到这里,其实有一个有意思的小问题已经出现了:其实,在Python编程实现某个功能的时候其实我们有很多选择,脚本语言本来就擅长吸收中价值所长嘛!如此,如果创建一个目录我现在会用的已经有两种方法了。
方法1:
import os
dir_name = 'test'
os.system('mkdir%s' % dir_name)
运行结果:
In [1]: ls
驱动器 E 中的卷没有标签。
卷的序列号是 2013-5089
E:\WorkSpace\01_编程语言\03_Python\python_exp01的目录
2017/03/29 20:58 <DIR> .
2017/03/29 20:58 <DIR> ..
2017/03/29 20:59 70 python_exp01.py
1 个文件 70 字节
2 个目录77,685,592,064 可用字节
In [2]: %runpython_exp01.py
In [3]: ls
驱动器 E 中的卷没有标签。
卷的序列号是 2013-5089
E:\WorkSpace\01_编程语言\03_Python\python_exp01的目录
2017/03/29 21:00 <DIR> .
2017/03/29 21:00 <DIR> ..
2017/03/29 20:59 70 python_exp01.py
2017/03/29 21:00 <DIR> test
1 个文件 70 字节
3 个目录77,685,592,064 可用字节
由以上结果可以看出,脚本成功调用了系统的mkdir命令实现了目录的创建。
方法2:
import os
dir_name = 'test'
os.mkdir(dir_name)
运行结果:
In [8]: ls
驱动器 E 中的卷没有标签。
卷的序列号是 2013-5089
E:\WorkSpace\01_编程语言\03_Python\python_exp02的目录
2017/03/29 21:01 <DIR> .
2017/03/29 21:01 <DIR> ..
2017/03/29 21:02 54 python_exp02.py
1 个文件 54 字节
2 个目录77,685,592,064 可用字节
In [9]: %runpython_exp02.py
In [10]: ls
驱动器 E 中的卷没有标签。
卷的序列号是 2013-5089
E:\WorkSpace\01_编程语言\03_Python\python_exp02的目录
2017/03/29 21:02 <DIR> .
2017/03/29 21:02 <DIR> ..
2017/03/29 21:02 54 python_exp02.py
2017/03/29 21:02 <DIR> test
1 个文件 54 字节
3 个目录77,685,592,064 可用字节
从结果看,这种方法与第一种方法取得了同样的效果。但是,总体上说来这种方法还是有优势的。首先,代码简洁了许多;其次,你不需要去了解操作系统环境中本身存在的命令或者功能,因为Python中已经提供了一个通用的接口。总体说来,这种方法不仅仅是提升了代码的可读性,同时也提高了代码的可移植性。