简单认识 os 模块后,来看如何使用 – 输出当前的操作系统:
>>> import os >>> os.name # 操作系统 ‘posix’ |
如果是 posix,说明系统是 Linux;如果是 nt,则是 Windows 系统。
三、获取当前工作目录
要获取当前工作目录,有两种方式:
getcwd():以 unicode 字符串的形式返回
getcwdb():以 bytes 字符串的形式返回
>>> os.getcwd() ‘/home/wang/workspace’ >>> >>> os.getcwdb() b’/home/wang/workspace’ |
四、更改当前工作目录
可以使用 chdir() 更改当前工作目录:
>>> os.getcwd() # 更改前 ‘/home/wang/workspace’ >>> >>> os.chdir(“/etc”) # 更改当前工作目录 >>>
>>> os.getcwd() # 更改后 ‘/etc’ |
注意: 在 Windows 中,经常也会使用反斜杠(),这时使用转义序列(\)更安全。
五、列出文件和目录
目录中的所有文件和子目录可以使用 listdir() 列出:
>>> os.listdir(‘/’) # 列出根目录 / 中的文件和子目录 [‘boot’, ‘dev’, ‘home’, ‘proc’, ‘run’, ‘sys’, ‘var’, ‘etc’, ‘root’, ‘tmp’, ‘usr’, ‘bin’, ‘sbin’, ‘lib’, ‘lib64’, ‘media’, ‘mnt’, ‘opt’, ‘srv’] >>> >>> os.getcwd() ‘/home/wang/workspace’
>>> os.listdir() # 列出当前目录中的文件和子目录 [‘python’, ‘README.txt’] |
注意: 如果没有指定路径,将从当前目录返回。
六、创建目录
可以使用 mkdir() 创建目录:
>>> os.listdir() # 创建前 [‘python’, ‘README.txt’] >>> >>> os.mkdir(“PHP”) # 在当前路径下,创建名为 PHP 的目录 >>>
>>> os.listdir() # 创建后 [‘python’, ‘README.txt’, ‘PHP’] |
注意: 如果未指定完整路径,则将在当前目录中创建。
七、重命名文件或目录
rename() 可以重命名文件或目录,第一个参数为旧名称,第二个参数为新名称:
>>> os.listdir() # 重命名前 [‘python’, ‘README.txt’, ‘PHP’] >>> >>> os.rename(“README.txt”, “Notice.txt”) # 重命名文件 >>> os.rename(“PHP”, “Java”) # 重命名空目录
>>> os.rename(“python”, “Py”) # 重命名非空目录 >>> >>> os.listdir() # 重命名后 [‘Notice.txt’, ‘Java’, ‘Py’] |
可以看到,无论目录是否为空,都可以重命名成功。
八、删除文件或目录
可以使用 remove() 删除文件,使用 rmdir() 删除空目录:
>>> os.listdir() # 删除前 [‘Notice.txt’, ‘Java’, ‘Py’] >>> >>> os.remove(“Notice.txt”) # 删除文件 >>> os.rmdir(“Java”) # 删除空目录
>>> >>> os.listdir() # 删除后 [‘Py’] |
注意: rmdir() 只能删除空目录,无法删除非空目录。否则,会引发 OSError。
要删除非空目录,需要借助 shutil 模块,使用 rmtree():
>>> os.listdir() [‘Py’] >>> >>> os.rmdir(“Py”) # 无法删除非空目录 …
OSError: [Errno 39] Directory not empty: ‘Py’ >>> >>> import shutil >>> shutil.rmtree(“Py”) # 删除非空目录 >>> >>> os.listdir() [] |
但是,复制、移动文件的相关函数居然在 os 模块中不存在!原因是复制文件并非由操作系统提供的系统调用。
幸运的是,shutil 模块提供了 copy()、move() 相关的函数,还可以在 shutil 模块中找到很多实用函数,它们可以看做是 os 模块的补充。
九、遍历目录
walk() 是遍历目录常用的方法,它返回一个包含 3 个元素的元组:(dirpath, dirnames, filenames):
dirpath:以字符串形式返回该目录下所有的绝对路径
dirnames:以列表形式返回每一个绝对路径下的目录
filesnames:以列表形式返回该路径下所有文件
使用命令 tree,以树状图列出目录的内容:
[wang@localhost workspace]$ tree . ├── python │ ├── Notice.txt │ └── os
│ ├── test2.py │ └── test.py └── README.txt 2 directories, 4 files |
使用 walk() 方法:
>>> for root, dirs, files in os.walk(“/home/wang/workspace”): … print(root) … print(dirs) … print(files) … print()
… /home/wang/workspace [‘python’] [‘README.txt’] /home/wang/workspace/python [‘os’] [‘Notice.txt’] /home/wang/workspace/python/os [] [‘test.py’, ‘test2.py’] |