文件与系统操作 (os & pathlib)

一. 认识文件路径处理

在进行数据分析或编写程序时,我们不可避免地需要读取本地文件(如 CSV、Excel、图片等)或将结果保存到本地。这就要求程序必须能够正确地找到文件所在的位置,即“文件路径”。

在 Python 中,处理文件路径和进行操作系统层面(如创建文件夹、删除文件)交互,主要有两套核心工具:

  1. 传统的 os 模块:自 Python 诞生起就存在,基于纯字符串进行路径拼接和处理。
  2. 现代的 pathlib 模块(核心是 Path 对象):Python 3.4 引入,基于面向对象的思维,操作更加直观、优雅,是目前推荐的写法。

二. os与os.path模块

os 模块提供了非常丰富的与操作系统交互的接口。其中,处理文件路径的相关方法主要集中在 os.path 子模块中。os模块处理的路径,本质上都是普通的字符串(str)!

需要import osimport 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。你会发现代码的可读性、跨平台性和编写的畅快感都有质的飞跃!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐