如果我们要操作文件、目录,可以在命令行(cmd命令)下面输入操作系统提供的各种命令来完成。比如 dircp(Linux下 cp命令主要用于复制文件或目录)等命令。

如果要在 Python 程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python 内置的os模块也可以直接调用操作系统提供的接口函数。

打开 Python 交互式命令行,我们来看看如何使用 os 模块的基本功能:

一、OS(Operating System,操作系统)模块的常见用法

os 模块提供了非常丰富的方法用来处理文件和目录,在操作之前,我们需先 import os 。常用的方法如下所示:

1、os.getcwd() — 得到当前工作目录,即当前Python脚本工作的目录路径

import os
>>> os.getcwd()
'C:\\Users\\lenovo'

2、os.chdir() — 改变当前工作目录

>>> os.chdir("d:\\st13\\python")
>>> os.getcwd()
'd:\\st13\\python'

3、os.listdir() — 返回指定目录下的所有文件和目录名

>>> os.listdir()    #返回当前目录下的所有文件和目录
['1.10', '1.11', '1.14', '1.15', '1.16', '1.17', '1.18', '1.19', '1.20', '1.9', '12306.py', '学习视 频']
>>> os.listdir("d:\\st13")   #返回指定目录下的所有文件和目录
['Java', 'python', '网络基础', '预科']

4、os.mkdir() — 在当前目录下创建单级目录

>>> os.mkdir("test")
>>> os.listdir()
['1.10', '1.11', '1.14', '1.15', '1.16', '1.17', '1.18', '1.19', '1.20', '1.9', '12306.py', 'test', '学习视频']

5、os.makedirs() — 在当前目录下创建多级目录

>>> os.makedirs("lx\\1\\2\\3")

6、os.rmdir() — 删除 path 指定的空目录,如果目录非空,则抛出一个OSError异常

>>> os.rmdir("test")
>>> os.rmdir("lx")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [WinError 145] 目录不是空的。: 'lx'

7、os.remove() — 删除路径为 path 的文件。如果path 是一个文件夹,将抛出OSError

>>> os.remove("d:\\st13\\python\\1.jpg")

8、os.rename() — 对文件重命名

>>> os.listdir()
['1.10', '1.11', '1.14', '1.15', '1.16', '1.17', '1.18', '1.19', '1.20', '1.9', '12306.py', 'lx', 'photo', '学习视频']
>>> os.rename('photo','zhaopian')   #将当前目录下的'photo'重命名为'zhaopian'
>>> os.listdir()
['1.10', '1.11', '1.14', '1.15', '1.16', '1.17', '1.18', '1.19', '1.20', '1.9', '12306.py', 'lx', 'zhaopian', '学习视频']

9、os.system() — 执行操作系统的命令,将结果输出到屏幕,并返回命令执行的状态(0:成功,非0:失败)

import os
>>> os.system('dir')  #返回运行结果和命令执行的状态

10、os.popen() — 执行操作系统的命令,会将结果保存在内存中,可以用read()方法读取出来

>>> import os
>>> result=os.popen('dir').read()   #查看当前目录中的文件和文件夹
>>> print(result)

10、os.path.isdir() — 判断给出的路径是否是一个目录(返回 Ture or False)

>>> os.path.isdir("1.10")
True
>>> os.path.isdir("1.10\\zuoye1.py")
False

11、os.path.isfile() — 判断给出的路径是否是一个文件(返回 Ture or False)

>>> os.path.isfile("1.10\\zuoye1.py")
True

 12、os.path.abspath() — 获得当前目录的绝对路径。

>>> os.path.abspath("test")
'd:\\st13\\python\\test'

13、os.path.join() — 把目录和文件名合成一个路径。

#把两个路径合成一个时,使用 os.path.join() 函数,可以正确处理不同操作系统的路径分隔符。
>>> os.path.join("test","1.txt")
'test\\1.txt'

14、os.path.split() — 把路径分割成 '目录名' 和 '目录名或文件名',并返回一个元组。

>>> os.path.split("d:\\st13\\python\\photo")
('d:\\st13\\python', 'photo')   #后一部分总是最后级别的目录或文件名

15、os.path.splitext() — 分割路径,并返回路径名和文件扩展名的元组。

>>> os.path.splitext("d:\\st13\\python\\1.jpg")
('d:\\st13\\python\\1', '.jpg')

16、os.path.dirname() — 去掉最后的目录或文件名,返回目录路径。

>>> os.path.dirname("d:\\st13\\python\\1.jpg")  
'd:\\st13\\python'

17、os.path.getsize() — 返回文件大小;如果路径是目录,返回0,如果路径为文件,则返回文件的字节数。

>>> os.path.getsize('d:\\st13\\python\\photo')
0
>>> os.path.getsize('d:\\st13\\python\\photo\\1.jpg')
83016

注意:Python的 os 模块封装了操作系统的目录和文件操作,要注意这些函数有的在 os 模块中,有的在 os.path 模块中。 

二、shutil(shell utility的缩写)模块的常见用法

shutil是shell utility的缩写,实现了在Python中实现文件复制、移动、压缩、解压等高级功能,是Python的系统模块,不需要额外安装。

1、shutil.rmtree(src) — 递归删除一个目录以及目录内的所有内容,无论是否空目录

>>> import shutil
>>> shutil.rmtree('lx')  #删除当前目录下的非空目录lx

2、shutil.copy( src, dst) — 复制一个文件到一个文件或一个目录

>>> shutil.copy('zhaopian\\1.jpg','zhaopian\\2.jpg')  #复制1.jpg到zhaopian目录下,并命名为2.jpg
'zhaopian\\2.jpg'

3、shutil.move( src, dst) — 移动文件或重命名

#将zhaopian目录下的1.jpg移动到d:\\st13\\python的目录下;当前路径为d:\\st13\\python
>>> shutil.move('zhaopian\\1.jpg','d:\\st13\\python')
'd:\\st13\\python\\1.jpg'
#将d:\\st13\\python目录下的1.jpg移动到d:\\st13\\python目录下的3.jpg,相当于重命名
>>> shutil.move('1.jpg','3.jpg')
'3.jpg'

4、shutil.copyfile( src, dst) — 从源src复制到dst中去。前提是目标地址具备可写权限,抛出的异常信息为IOException。如果当前的dst已存在的话就会被覆盖掉。且src和dst必须是文件

5、shutil.copymode( src, dst) — 只是会复制其权限,其他的东西是不会被复制的

6、shutil.copystat( src, dst) — 复制权限、最后访问时间、最后修改时间

7、shutil.copytree( olddir, newdir, True/Flase) — 把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接;如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接