Files
python/20-24/07file-path.py
2026-05-06 11:21:42 +08:00

408 lines
11 KiB
Python

# Python 提供了强大的文件路径操作功能,主要使用 os.path 模块和 pathlib 模块。掌握路径操作对于文件管理、数据处理和跨平台开发至关重要。
# 核心概念
# 路径:指向文件或目录的字符串或对象
# 绝对路径:从根目录开始的完整路径
# 相对路径:相对于当前工作目录的路径
# 跨平台:不同操作系统使用不同的路径分隔符
# 导入必要模块
import os # 操作系统接口
import os.path # 传统路径操作
from pathlib import Path # 现代路径操作(推荐)
import glob # 文件通配符搜索
import shutil # 高级文件操作
# os.path 模块 - 传统路径操作
# 路径拼接和分解
# 路径拼接
# 使用 os.path.join() 自动处理不同操作系统的路径分隔符:
import os
# 路径拼接 - 自动处理分隔符
full_path = os.path.join("父文件夹", "子文件夹", "文件.txt")
print(full_path) # Linux/Mac: 父文件夹/子文件夹/文件.txt
# Windows: 父文件夹\子文件夹\文件.txt
# 获取文件名和目录名
import os
path = "/home/user/documents/file.txt"
# 获取文件名
print(os.path.basename(path)) # file.txt
# 获取目录名
print(os.path.dirname(path)) # /home/user/documents
# 分割路径
print(os.path.split(path)) # ('/home/user/documents', 'file.txt')
# 分离扩展名
import os
# 分离文件名和扩展名
name, ext = os.path.splitext("example.tar.gz")
print(name) # example.tar
print(ext) # .gz
# 获取绝对路径
import os
# 获取绝对路径
print(os.path.abspath("file.txt")) # 不解析符号链接
print(os.path.realpath("file.txt")) # 解析符号链接
# 路径检查和属性
# 函数 描述 返回值
# os.path.exists() 检查路径是否存在 True/False
# os.path.isfile() 检查是否为文件 True/False
# os.path.isdir() 检查是否为目录 True/False
# os.path.islink() 检查是否为符号链接 True/False
# os.path.getsize() 获取文件大小 字节数
# os.path.getmtime() 获取最后修改时间 时间戳
# os.path.getatime() 获取最后访问时间 时间戳
import os
path = "/home/user/documents"
# 检查路径属性
print(os.path.exists(path)) # True/False
print(os.path.isfile(path)) # True/False
print(os.path.isdir(path)) # True/False
print(os.path.islink(path)) # True/False
# 获取文件信息
if os.path.isfile(path):
print(f"文件大小: {os.path.getsize(path)} 字节")
print(f"修改时间: {os.path.getmtime(path)}")
# pathlib 模块 - 现代路径操作(推荐)
# pathlib 是 Python 3.4+ 引入的现代路径操作模块,提供面向对象的接口,更加直观和易用。
# 创建路径对象
from pathlib import Path
# 创建路径对象
path1 = Path("/home/user/documents") # 绝对路径
path2 = Path("relative/path") # 相对路径
path3 = Path.cwd() # 当前工作目录
path4 = Path.home() # 用户主目录
print(f"绝对路径: {path1}")
print(f"当前目录: {path3}")
print(f"用户主目录: {path4}")
# 路径对象优势
# 面向对象:更直观的 API 设计
# 跨平台:自动处理路径分隔符
# 链式操作:支持方法链式调用
# 类型安全:更好的类型提示支持
# 路径属性和方法
# 基本属性
from pathlib import Path
p = Path("/home/user/example/file.txt")
# 路径组成部分
print(f"完整路径: {p}") # /home/user/example/file.txt
print(f"文件名: {p.name}") # file.txt
print(f"文件名(无后缀): {p.stem}") # file
print(f"扩展名: {p.suffix}") # .txt
print(f"父路径: {p.parent}") # /home/user/example
print(f"磁盘/锚: {p.anchor}") # Linux: /, Windows: C:\
# 路径修改
# 路径修改方法
print(f"替换文件名: {p.with_name('data.csv')}") # /home/user/example/data.csv
print(f"替换扩展名: {p.with_suffix('.md')}") # /home/user/example/file.md
# 路径检查
# 基本检查
print(f"是否存在: {p.exists()}")
print(f"是否为文件: {p.is_file()}")
print(f"是否为目录: {p.is_dir()}")
print(f"是否为绝对路径: {p.is_absolute()}")
print(f"绝对路径: {p.resolve()}")
# 安全获取文件信息
# 安全地获取文件信息
if p.is_file():
stat = p.stat()
print(f"文件大小: {stat.st_size} 字节")
print(f"最后修改: {stat.st_mtime}")
else:
print("不是文件,无法获取大小和时间")
# 路径遍历和文件操作
# 目录遍历
from pathlib import Path
folder = Path("src")
# 遍历目录内容(非递归)
for item in folder.iterdir():
print(item)
# 使用通配符查找文件
for py_file in folder.glob("*.py"):
print(py_file)
# 递归查找文件
for py_file in folder.rglob("*.py"):
print(py_file)
# 目录创建
# 创建单个目录
new_folder = Path("new_directory")
new_folder.mkdir(exist_ok=True) # 已存在不报错
# 创建多级目录
deep_folder = Path("level1/level2/level3")
deep_folder.mkdir(parents=True, exist_ok=True)
# 常用遍历方法
# 方法 描述 递归
# iterdir() 列出目录内容 否
# glob(pattern) 通配符查找 否
# rglob(pattern) 递归查找 是
# 通配符模式
# *:匹配任意多个字符
# ?:匹配单个字符
# **:递归匹配(仅在 rglob 中有效)
# 常用路径操作示例
# 获取当前目录信息
import os
from pathlib import Path
# 获取当前工作目录
current_dir = os.getcwd() # 返回字符串
print(f"当前工作目录: {current_dir}")
# 使用 pathlib 获取当前目录
current_path = Path.cwd() # 返回 Path 对象
print(f"当前路径: {current_path}")
# 获取用户主目录
home_dir = Path.home()
print(f"用户主目录: {home_dir}")
# 路径规范化
from pathlib import Path
# 处理相对路径和符号链接
path = Path("../../Documents/../file.txt")
print(f"原始路径: {path}")
print(f"解析后路径: {path.resolve()}")
# 计算相对路径
base_path = Path("/home/user/documents")
target_path = Path("/home/user/documents/work/project/file.txt")
relative_path = target_path.relative_to(base_path)
print(f"相对路径: {relative_path}") # work/project/file.txt
# 文件路径操作综合示例
from pathlib import Path
# 定义多种路径示例
paths = [
"/home/user/documents/report.pdf",
"relative/path/file.txt",
"../parent/file.py",
"file_no_extension",
"archive.tar.gz",
]
# 分析每个路径
for path_str in paths:
path = Path(path_str)
print(f"\n分析路径: {path}")
print(f"文件名: {path.name}")
print(f"主干名: {path.stem}")
print(f"扩展名: {path.suffix}")
print(f"父目录: {path.parent}")
print(f"是否为绝对路径: {path.is_absolute()}")
# 文件和目录操作
# 文件操作
# 使用 pathlib 进行文件操作更加简洁和安全
from pathlib import Path
# 创建文件并写入内容
file_path = Path("test.txt")
file_path.write_text("Hello, World!", encoding="utf-8")
# 读取文件内容
content = file_path.read_text(encoding="utf-8")
print(content)
# 获取文件信息
if file_path.exists():
stat = file_path.stat()
print(f"文件大小: {stat.st_size} 字节")
print(f"最后修改: {stat.st_mtime}")
# 重命名文件
new_path = file_path.rename("new_test.txt")
# 文件操作优势
# 简洁性:一行代码完成文件读写
# 安全性:自动处理编码和异常
# 跨平台:自动处理路径分隔符
# 类型安全:更好的错误提示
# 目录操作
# 创建目录
from pathlib import Path
import shutil
# 创建单个目录
Path("example_dir").mkdir(exist_ok=True)
# 创建多级目录
Path("parent/child/grandchild").mkdir(parents=True, exist_ok=True)
# 遍历目录
# 遍历目录内容
folder = Path("example_dir")
print("目录内容:")
for item in folder.iterdir():
if item.is_dir():
print(f"目录: {item.name}")
else:
print(f"文件: {item.name}")
# 目录复制和删除
# 复制整个目录
shutil.copytree("example_dir", "copy_dir", dirs_exist_ok=True)
# 删除空目录
Path("empty_dir").mkdir(exist_ok=True)
Path("empty_dir").rmdir()
# 删除非空目录
shutil.rmtree("copy_dir")
# 目录操作优势
# 安全性:exist_ok=True 避免重复创建错误
# 递归性:parents=True 自动创建父目录
# 完整性:shutil 提供完整的目录操作
# 跨平台:自动处理不同操作系统的差异
# 跨平台路径处理
# 操作系统检测
from pathlib import Path
import os
# 根据操作系统选择路径
if os.name == "nt": # Windows
path = Path("C:/Users/Name/Documents")
else: # Unix/Linux/Mac
path = Path("/home/name/documents")
# 路径拼接
file_path = path / "subfolder" / "file.txt"
print(f"文件路径: {file_path}")
# 转换为字符串
path_str = str(file_path)
print(f"字符串路径: {path_str}")
# 跨平台优势
# 自动分隔符:pathlib 自动处理 / 和 \
# 路径标准化:统一路径表示方式
# 兼容性:代码在不同系统上都能正常工作
# 类型安全:Path 对象提供更好的类型提示
# 实用函数示例
# 文件查找函数
from pathlib import Path
def find_files_by_extension(directory, extension):
"""查找指定目录下指定扩展名的所有文件"""
directory_path = Path(directory)
return list(directory_path.rglob(f"*{extension}"))
# 使用示例
python_files = find_files_by_extension(".", ".py")
print("找到的 Python 文件:")
for file in python_files:
print(f" {file}")
# 文件信息获取函数
def get_file_info(file_path):
"""获取文件的详细信息"""
path = Path(file_path)
if path.exists() and path.is_file():
stat = path.stat()
return {
"name": path.name,
"size": stat.st_size,
"modified": stat.st_mtime,
"absolute_path": str(path.absolute()),
}
return None
# 使用示例
if python_files:
file_info = get_file_info(python_files[0])
print(f"文件信息: {file_info}")
# 文件备份函数
import shutil
def create_backup(file_path):
"""创建文件备份"""
path = Path(file_path)
if path.exists() and path.is_file():
backup_path = path.with_suffix(".bak")
shutil.copy2(path, backup_path)
return backup_path
return None
# 使用示例
backup_file = create_backup("example.txt")
if backup_file:
print(f"备份文件: {backup_file}")
# 实用函数优势
# 模块化:每个函数专注单一功能
# 可重用:可以在不同项目中重复使用
# 错误处理:包含适当的错误检查
# 类型安全:使用 Path 对象提供更好的类型支持
# 最佳实践
# 10.1.路径操作原则
# 使用 pathlib:新项目推荐使用 pathlib,更现代、更直观
# 路径分隔符:使用 / 或 os.path.join(),避免直接使用 \
# 路径检查:操作前检查路径是否存在
# 异常处理:使用 try-except 处理路径操作错误
# 跨平台兼容:确保代码在不同操作系统上都能正常工作
# 10.2.性能优化建议
# 缓存路径对象:避免重复创建 Path 对象
# 批量操作:使用 glob 和 rglob 进行批量文件操作
# 路径规范化:使用 resolve() 获取规范路径
# 内存管理:及时释放不需要的路径对象
# 10.3.安全注意事项
# 路径验证:验证用户输入的路径
# 权限检查:确保有足够的文件操作权限
# 符号链接:注意符号链接可能带来的安全风险
# 路径遍历:防止路径遍历攻击