如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。
如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。
打开Python交互式命令行,我们来看看如何使用os模块的基本功能:
import os
print(os.name) #操作系统类型
如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
环境变量
print(os.environ) #查看环境变量
#查看某一个环境变量的值
print(os.environ.get('PATH'))
#查找不到显示默认值
print(os.environ.get('x', 'default'))
操作文件和目录
一些常见操作如下,注释以及写好:
import os
#查看当前绝对路径
print(os.path.abspath('.'))
#准备创建某一个目录 显示一下
print(os.path.join('D:/', 'testDir'))
#创建文件夹
os.mkdir('D:/testDir')
#删除文件夹
os.rmdir('D:/testDir')
#文件重命名
os.rename('test.py', 'test_3.py')
#文件删除
os.remove('xxx')
#路径拆分 最后一部分总是最后级别的目录或者文件
print(os.path.split('D:/1.jpg'))
#打印结果 ('D:/', '1.jpg')
#获取文件 扩展名
print(os.path.splitext('D:/1.jpg'))
#打印结果 ('D:/1', '.jpg')
但是os中没有复制文件的操作。
原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。
幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。
过滤文件
对于python代码能用一行实现的决不使用两行。
#列出当前目录下的 文件
print([x for x in os.listdir('.') if os.path.isfile(x)])
#列出所有.py文件
print([x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py'])
#打印结果
['test_1', 'test_2.py', 'test_3.py', 'test_4.py']
['test_2.py', 'test_3.py', 'test_4.py']
注意
PythonPython的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。
一个例子
例如实现一个查找目录下文件名带有某一字段的文件。
def search(dir ,text):
for x in os.listdir(dir):
#因为x此时只会打印出文件名 需要补上路径 文件名包含text字段的
if os.path.isfile(os.path.join(dir, x)) and text in os.path.splitext(x)[0]:
print('%s . %s' % (dir,x))
if os.path.isdir(os.path.join(dir, x)):
search(os.path.join(dir, x), text)
search(r'D:\test', '34')
#打印结果
D:\test\222 . 333444.txt
D:\test . 333444.txt