Python os 模块简介
上一节介绍的 pathlib 模块主要用于操作路径,而 os 模块主要用于操作目录和文件。在 Python 中,os 模块提供的函数有很多,常用的如下表所示。
| 函数 | 说明 |
|---|---|
| os.getcwd() | 获取工作目录 |
| os.chdir() | 切换工作目录 |
| os.listdir() | 列举所有文件和目录(即文件夹) |
| os.walk() | 遍历目录 |
| os.path.getsize() | 获取文件大小 |
| os.path.getctime()、os.path.getmtime()、os.path.getatime() | 获取文件时间 |
注意: os 提供的都是 “函数”,而不是 “方法”。os.getcwd() 指的是 os 模块下的 getcwd() 函数,而不是 os 对象下的 getcwd() 方法。而 os.path.getsize() 指的是 os 模块下 path 子模块的 getsize() 函数。
os.getcwd() 获取工作目录
在 Python 中,我们可以使用 os.getcwd() 函数来获取当前工作目录,也就是当前 .py 文件所在的文件夹的路径。
语法:
os.getcwd()说明:
getcwd 是 “get current work directory(获取当前工作目录)” 的缩写。
示例 1:获取当前工作目录
import os
print(os.getcwd())运行结果如下。
D:\python-test分析:
在 VSCode 的控制台中,也可以很直观地看出当前工作目录是什么,如下图所示。

可能你就会问了:“如果想要获取包含当前文件名的完整文件路径,那又该怎么实现呢?” 其实非常简单,我们可以使用 “__file__” 来实现。特别注意,__file__ 的前后都是双下划线。
示例 2:获取当前 .py 文件的完整路径
print(__file__)运行结果如下。
D:\python-test\test.py分析:
__file__ 是 Python 内置的变量,所以不需要引入 os 模块。
os.chdir() 改变工作目录
在 Python 中,我们可以使用 os.chdir() 函数来将当前工作目录切换为其他路径。
语法:
os.chdir(路径)说明:
由于 chdir() 函数需要将当前工作目录切换为 “其他路径”,因此需要提供一个路径给它。
示例 3:使用 os.chdir()
import os
print('切换前:', os.getcwd())
os.chdir(r'E:\python-test')
print('切换后:', os.getcwd())运行结果如下。
切换前: D:\python-test
切换后: E:\python-test分析:
在上面示例中,由于 test.py 文件是在 “D:\python-test” 这个目录下的,因此第一个 os.getcwd() 获取的结果是 “D:\python-test”。接着使用 os.chdir() 函数来将当前工作目录切换为 “E:\python-test”,再使用 getcwd() 函数来获取当前工作目录,因此第二个 os.getcwd() 获取的结果是 “E:\python-test”。
由于这里已经改变了当前工作目录,可能会影响后面示例的效果。所以一定要执行下面的代码,来把当前工作目录切换成原来的工作目录。
import os
os.chdir(r'D:\python-test')os.listdir() 列举所有文件
在 Python 中,我们可以使用 os.listdir() 函数来列举某个目录下的所有文件和目录(即文件夹)。
语法:
os.listdir(path)说明:
接下来,在当前项目下创建一个名为 “files” 的文件夹,然后放入一些文件(本书配套文件可以找到),整个项目结构如下图所示。

示例 4:使用 os.listdir()
import os
files = os.listdir(r'files')
print(files)运行结果如下。
['animal', 'planet', 'test.docx', 'test.jpg', 'test.pdf', 'test.txt', 'test.xlsx', 'test.zip']分析:
listdir() 函数返回的是一个列表,列表中每一个元素对应一个文件或目录。如果是文件,则包含文件名和后缀名。
os.walk() 遍历文件夹
在 Python 中,我们可以使用 os.walk() 函数来遍历一个文件夹(即目录)。
语法:
for root, dirs, files in os.walk(path):
……说明:
root 表示当前正在访问的文件夹路径,dirs 表示该文件夹下一级都有哪些子文件夹,files 表示该文件夹下一级都有哪些文件。
接下来,将当前项目结构重塑成如下图所示。在当前项目下创建一个 src 文件夹,然后 src 子级有两个子文件夹:animal 和 planet,并且还有两个文件:A.txt 和 B.txt。此外,animal 和 planet 这两个文件夹还有下一级的文件。

示例 5:遍历目录
import os
for root, dirs, files in os.walk(r'src'):
print(root)
print(dirs)
print(files)运行结果如下。
src
['animal', 'planet']
['A.txt', 'B.txt']
src\animal
[]
['ant.txt', 'bee.txt']
src\planet
[]
['apple.txt', 'banana.txt']分析:
os.walk() 其实是使用递归的方式来进行遍历,从结果可以看出,这里其实是遍历了 3 次。
第 1 次遍历,当前遍历的文件夹是:src,子文件夹有:['animal', 'planet'],子文件有:['A.txt', 'B.txt']。
第 2 次遍历,当前遍历的文件夹是:src\animal,子文件夹有:[],子文件有:['ant.txt', 'bee.txt']。其中子文件夹为 “[]”,也就是没有子文件夹的意思。
第 3 次遍历,当前遍历的文件夹是:src\planet,子文件夹有:[],子文件有:['apple.txt', 'banana.txt']。
示例 6:获取所有文件名
import os
result = []
for root, dirs, files in os.walk(r'src'):
for file in files:
result.append(file)
print(result)运行结果如下。
['A.txt', 'B.txt', 'ant.txt', 'bee.txt', 'apple.txt', 'banana.txt']分析:
上面示例实现的效果是:使用 os.walk() 函数来把 src 文件夹下的所有 “文件(包含文件名和后缀名)” 给遍历出来,然后保存到一个列表中去。
示例 7:获取所有文件的路径
import os
result = []
for root, dirs, files in os.walk(r'src'):
for file in files:
# 1. 使用 os.path.join 智能拼接路径(自动处理跨平台分隔符)
filepath = os.path.join(root, file)
# 2. 使用 os.path.abspath 获取绝对路径
abs_path = os.path.abspath(filepath)
result.append(abs_path)
print(result)运行结果如下。
['D:\\python-test\\src\\A.txt', 'D:\\python-test\\src\\B.txt', 'D:\\python-test\\src\\animal\\ant.txt', 'D:\\python-test\\src\\animal\\bee.txt', 'D:\\python-test\\src\\planet\\apple.txt', 'D:\\python-test\\src\\planet\\banana.txt']分析:
在拼接路径时,我们千万不要使用字符串加号(+ '\\' +)来硬拼接!这是因为 Windows 和 Linux 这两个系统的分隔符是不同的。其中,Windows 的分隔符是 “\”,而 Mac/Linux 是 “/”。
我们强烈建议永远使用 os.path.join(),它会根据当前的操作系统,自动为你选择正确的分隔符,从而让你的代码具备跨平台运行的能力!获取绝对路径时,也推荐直接使用 os.path.abspath()。
os.path.getsize() 获取文件大小
在 Python 中,我们可以使用 os.path.getsize() 函数来获取某一个文件的大小。
语法:
os.path.getsize(path)说明:
为了方便测试,需要重塑目录结构如下图所示。

示例 8:使用 os.path.getsize()
import os
filesize = os.path.getsize(r'img\logo.png')
print('filesize:', filesize)运行结果如下。
filesize: 27605分析:
getsize() 函数获取的大小值的单位是 B(字节),但是大多数情况下都会将其换算为常见的文件大小表示。具体是怎么转换的,请看下面例子。
示例 9:转化单位
import os
# 获取大小
filesize = os.path.getsize(r'img\logo.png')
# 转换单位
units = ['B', 'KB', 'MB', 'GB', 'TB']
index = 0
while filesize > 1024:
filesize /= 1024
index += 1
# 四舍五入保留 2 位小数
filesize = round(filesize, 2)
# 获取结果
result = f'{filesize}{units[index]}'
# 运行结果
print(result)运行结果如下。
26.96KB分析:
round(x, n) 用于返回一个浮点数的四舍五入值,该方法有两个参数:x 是一个浮点数,n 表示保留 n 位小数。对于 round() 函数,前面章节已经介绍过了。
Python os 获取文件时间
在 Python 中,我们可以使用 getctime() 函数获取文件或文件夹的创建时间,也可以使用 getmtime() 方法获取文件或文件夹的修改时间,还可以使用 getatime() 方法获取文件或文件夹最后的访问时间。
语法:
os.path.getctime(path)
os.path.getmtime(path)
os.path.getatime(path)说明:
getctime(),指的是 “get create time”。getmtime(),指的是 “get modify time”。getatime(),指的是 “get access time”。
示例 10:获取时间戳
import os
ctime = os.path.getctime(r'D:\python-test\test.py')
mtime = os.path.getmtime(r'D:\python-test\test.py')
atime = os.path.getatime(r'D:\python-test\test.py')
print('getctime:', ctime)
print('getmtime:', mtime)
print('getatime:', atime)运行结果如下。
getctime: 1663551496.683697
getmtime: 1663997409.139237
getatime: 1663997409.139237分析:
从上面结果可以看出,getctime()、getmtime()、getatime() 这 3 个函数获取的都是时间戳,我们需要引入 time 模块,将时间戳转换为想要的时间格式才行。
示例 11:转换格式
import os
import time
ctime = os.path.getctime(r'D:\python-test\test.py')
local = time.localtime(ctime)
result = time.strftime('%Y-%m-%d %H:%M:%S', local)
print('Create Time:', result)运行结果如下。
Create Time: 2024-05-20 09:38:16分析:
这里拓展一下,如果一个程序需要同时导入多个模块,PEP 8 规范推荐每一个模块使用一个 import 语句导入,而不是只使用一个 import 语句一次性导入所有模块。
# 推荐
import os
import time
# 不推荐
import os, time