Python 文件和目录管理(os)

简述

目录(或文件夹)是文件和子目录的集合

在 Linux 中,操作系统提供了很多的命令(例如:lscd),用于文件和目录管理。在 Python 中,有一个 os 模块,也提供了许多便利的方法来管理文件和目录。

| 版权声明:一去、二三里,未经博主允许不得转载。

os 模块

os:语义为操作系统。所以,os 模块提供的肯定是操作系统相关的功能了(与具体的平台无关)。

如果用 dir() 查看 os,会发现内容相当多。下面,只列出文件和目录的相关方法:

方法 描述
getcwd() 获取当前工作目录
chdir(path) 将当前的工作目录更改为指定的路径
listdir(path=None) 列出指定目录中的文件名。如果 pathNone,则使用 path='.'
mkdir(path, mode=511, *, dir_fd=None) 创建目录
makedirs(name, mode=511, exist_ok=False) 递归创建多层目录
rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) 重命名文件或目录
remove(path, *, dir_fd=None) 删除文件
rmdir(path, *, dir_fd=None) 删除目录
removedirs(name) 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空抛出异常。
walk(top, topdown=True, onerror=None, followlinks=False) 遍历 top 路径下的所有子目录,返回一个包含 3 个元素的元组:(dirpath, dirnames, filenames)
os.curdir 指代当前目录('.'
os.pardir 指代上一级目录('..'
os.sep 路径分割符(Windows 为 '\\',Linux 为 '/'
os.linesep 行终止符(Windows 为 '\r\n',Linux 为 '\n'
os.name 指代当前使用的操作系统(Windows 系统为 'nt',Linux 为 'posix'

简单认识 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']
阅读更多

扫码向博主提问

一去丶二三里

博客专家

谈天、说地、侃代码、开车!
  • 擅长领域:
  • C++
  • Python
  • Qt
  • 架构
  • 算法
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011012932/article/details/78218051
所属专栏: Python 快速入门
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭