LLM系列:1.python入门:15.文件与系统操作 (os & pathlib)
本文介绍了Python中处理文件路径和系统操作的两大核心工具:传统的os模块和现代的pathlib模块。os模块基于字符串操作,提供基本路径处理功能,如os.getcwd()获取当前目录、os.listdir()列出目录内容、os.path.join()拼接路径等。pathlib模块则以面向对象方式封装路径操作,通过Path类实现更直观的路径处理,支持运算符重载(/)拼接路径,并提供exists(
文件与系统操作 (os & pathlib)
一. 认识文件路径处理
在进行数据分析或编写程序时,我们不可避免地需要读取本地文件(如 CSV、Excel、图片等)或将结果保存到本地。这就要求程序必须能够正确地找到文件所在的位置,即“文件路径”。
在 Python 中,处理文件路径和进行操作系统层面(如创建文件夹、删除文件)交互,主要有两套核心工具:
- 传统的
os模块:自 Python 诞生起就存在,基于纯字符串进行路径拼接和处理。 - 现代的
pathlib模块(核心是Path对象):Python 3.4 引入,基于面向对象的思维,操作更加直观、优雅,是目前推荐的写法。
二. os与os.path模块
os 模块提供了非常丰富的与操作系统交互的接口。其中,处理文件路径的相关方法主要集中在 os.path 子模块中。注os模块处理的路径,本质上都是普通的字符串(str)!
需要import os和import os.path
1. os.getcwd() - 获取当前工作目录
作用:获取运行当前Python脚本时,所处的绝对路径文件夹位置。
os.getcwd()
参数:
- 无参数。
返回值:
- 成功: 返回当前工作目录的绝对路径字符串(str)。
示例:
current_path = os.getcwd()
# 结果示例(Windows):'C:\\Users\\admin\\my_project'
2. os.listdir() - 列出目录内容
作用:获取指定文件夹下包含的所有文件和子文件夹的名称。
os.listdir(path='.')
参数:
- 路径 (path): 需要查看的目标文件夹路径。默认为
'.'(代表当前目录)(str)。
返回值:
- 成功: 返回包含该目录下所有文件和文件夹名称的列表(list[str])。注:返回的只是名称,不是完整路径。
示例:
files = os.listdir('C:\\Users\\admin\\Desktop')
# 结果示例:['report.csv', 'images', 'data.txt']
3. os.path.join() - 拼接路径
作用:将多个路径组件(文件夹名、文件名)智能地拼接合成一个完整的路径。注:这是 os 模块中最核心的方法!它会自动根据当前操作系统(Windows的 \ 还是 Mac/Linux的 /)使用正确的路径分隔符,绝对不要自己手动用 + 号去拼接字符串!
os.path.join(path, *paths)
参数:
- *路径组件 (path, paths): 需要拼接到一起的各个目录或文件名称(str)。
返回值:
- 成功: 返回拼接后的完整路径字符串(str)。
示例:
folder = "data_files"
file_name = "report.csv"
# 智能拼接
full_path = os.path.join(folder, file_name)
# 在 Windows 下结果为:'data_files\\report.csv'
# 在 Mac/Linux 下结果为:'data_files/report.csv'
4. os.path.exists() - 判断路径是否存在
作用:检查硬盘上是否真的存在某个指定的文件或文件夹。常用于读取文件前的安全检查。
os.path.exists(path)
参数:
- 路径 (path): 需要检查的目标路径(str)。
返回值:
- 成功: 如果路径存在返回
True,不存在返回False(bool)。
示例:
file_path = "C:\\Users\\admin\\Desktop\\data.csv"
is_exist = os.path.exists(file_path)
# 返回 True 或 False
三. pathlib模块(Path对象)
pathlib 模块提供了一种面向对象的方式来处理文件系统路径。它的核心是 Path 类。注:使用 Path 时,你操作的不再是一串干瘪的字符串,而是一个具有丰富属性和方法的对象!绝大多数现代库(如 Pandas)都完美原生支持传入 Path 对象。
需要from pathlib import Path
1. Path - 创建路径对象
作用:将字符串路径转化为一个 Path 对象,或者直接获取当前目录。
Path(*pathsegments)
Path.cwd()
参数:
- *路径片段 (pathsegments): 构成路径的字符串片段(str)。
返回值:
- 成功: 返回一个封装好的路径对象(Path)。
示例:
# 1. 明确创建一个路径对象
p1 = Path("C:/Users/admin/Desktop")
# 2. 获取当前工作目录(等效于 os.getcwd())
current_p = Path.cwd()
2. 操作符 ( / ) - 优雅地拼接路径
作用:Path 对象重载了除法运算符 /。使得路径的拼接变得像做数学除法一样直观、优雅,彻底告别了繁琐的 os.path.join。
Path_obj / 'string_or_Path'
参数:
- 无需函数参数,只要左边或右边至少有一个是
Path对象即可使用/拼接。
返回值:
- 成功: 返回拼接后的全新路径对象(Path)。
示例:
from pathlib import Path
base_folder = Path("C:/my_project")
# 使用 / 直接优雅拼接,自动处理操作系统的斜杠差异!
data_file = base_folder / "data" / "2023" / "sales.csv"
# 结果 data_file 依然是一个 Path 对象
3. Path 对象的常用属性与判断方法
作用:因为它是对象,所以提取文件名、后缀名或者判断是否存在,只需要直接调用它的属性或方法即可,极其方便。
-
exists(): 判断路径是否存在。 -
is_file(): 判断该路径是不是一个文件。 -
is_dir(): 判断该路径是不是一个文件夹。 -
name: 获取带后缀的完整文件名(如'sales.csv')。 -
stem: 获取纯文件名,不带后缀(如'sales')。 -
suffix: 获取文件后缀名(如'.csv')。 -
parent: 获取该文件所在的父级文件夹路径。
示例:
# 假设这是一个真实存在的文件
file_path = Path("C:/my_project/data/sales.csv")
# 1. 判断操作 (返回 bool)
file_path.exists() # True
file_path.is_file() # True
file_path.is_dir() # False
# 2. 获取属性 (返回 str 或 Path)
file_path.name # 'sales.csv'
file_path.stem # 'sales'
file_path.suffix # '.csv'
file_path.parent # Path('C:/my_project/data')
4. iterdir() & glob() - 遍历目录内容
作用:获取文件夹下的内容。iterdir 类似于 os.listdir 但返回生成器;glob 则支持强大的通配符模式匹配(例如只找 .csv 文件)。
Path.iterdir()
Path.glob(pattern)
参数:
- 匹配模式 (pattern): 字符串模式,例如
'*.csv'代表所有以 csv 结尾的文件(str)。
返回值:
- 成功: 返回一个生成器,遍历它可以得到目录下各个子文件/文件夹的
Path对象(Generator[Path])。
示例:
folder = Path("C:/my_project/data")
# 1. 遍历文件夹下所有的文件和文件夹
for item in folder.iterdir():
print(item.name)
# 2. (重点) 仅提取该文件夹下所有的 CSV 文件
for csv_file in folder.glob("*.csv"):
print("找到CSV:", csv_file.name)
四.总结对比
| 操作目的 | 传统 os (字符串) |
现代 pathlib (对象) |
|---|---|---|
| 获取当前目录 | os.getcwd() |
Path.cwd() |
| 拼接路径 | os.path.join(p1, p2) |
p1 / p2 |
| 判断是否存在 | os.path.exists(p) |
p.exists() |
| 判断是否为文件 | os.path.isfile(p) |
p.is_file() |
| 判断是否为文件夹 | os.path.isdir(p) |
p.is_dir() |
| 获取文件名 | os.path.basename(p) |
p.name |
| 获取文件后缀 | 需要 os.path.splitext(p) 切分 |
p.suffix |
| 获取父级文件夹 | os.path.dirname(p) |
p.parent |
| 提取特定格式文件 | 需要配合 glob 库 |
p.glob('*.csv') |
建议:
在未来的代码编写(尤其是数据分析配合 Pandas 时),强烈建议全面拥抱pathlib.Path。你会发现代码的可读性、跨平台性和编写的畅快感都有质的飞跃!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)