一、基本概念绝对路径从根目录开始写起的完整路径能唯一确定文件或目录的位置。相对路径从当前工作目录开始写起的路径依赖于当前所在位置。二、不同操作系统的表示方式Windows 系统# 绝对路径示例D:\projects\myapp\main.py# D盘根目录C:\Users\John\Documents\file.txt# C盘用户目录\\server\share\folder\file.txt# 网络共享路径# 相对路径示例main.py# 当前目录下的文件.\data\config.json# 当前目录下的data子目录.\可省略..\utils\helper.py# 上一级目录中的utils目录..\..\images\logo.png# 上两级目录中的images目录Linux/macOS 系统# 绝对路径示例/home/user/projects/myapp/main.py# 从根目录/开始/var/log/nginx/access.log# 系统日志目录/usr/local/bin/python# 可执行文件# 相对路径示例main.py# 当前目录下的文件./data/config.json# 当前目录下的data子目录./可省略../utils/helper.py# 上一级目录中的utils目录../../images/logo.png# 上两级目录中的images目录三、特殊符号含义符号含义示例.当前目录./data/file.txt..上一级目录../utils/helper.py~用户主目录Unix/Linux~/Documents/file.txt\Windows路径分隔符C:\Windows\System32/Unix/Linux/macOS路径分隔符/home/user/file.txt四、Python 代码示例4.1 获取和查看路径importosfrompathlibimportPath# 获取当前工作目录current_diros.getcwd()print(f当前目录:{current_dir})# Windows: C:\Users\John\project# Linux: /home/john/project# 使用 pathlibcurrentPath.cwd()print(f当前目录:{current})# 获取脚本所在目录script_diros.path.dirname(os.path.abspath(__file__))print(f脚本目录:{script_dir})4.2 绝对路径与相对路径转换frompathlibimportPath# 假设当前目录: /home/user/project# 相对路径rel_pathPath(data/config.json)print(f相对路径:{rel_path})# data/config.json# 转换为绝对路径abs_pathrel_path.absolute()print(f绝对路径:{abs_path})# /home/user/project/data/config.json# 获取绝对路径解析符号链接resolvedrel_path.resolve()print(f解析后:{resolved})# /home/user/project/data/config.json# 从绝对路径获取相对路径abs_path2Path(/home/user/project/docs/readme.md)rel_path2abs_path2.relative_to(Path.cwd())print(f相对当前目录:{rel_path2})# docs/readme.md4.3 实际应用示例importosfrompathlibimportPath# 示例1构建配置文件路径defload_config():# 获取脚本所在目录script_dirPath(__file__).parent# 使用相对路径定位配置文件config_pathscript_dir/../config/app.yaml# 规范化路径消除..config_pathconfig_path.resolve()print(f配置文件绝对路径:{config_path})# 输出: /home/user/project/config/app.yamlreturnconfig_path# 示例2检查路径类型defcheck_path_type(path_str):pathPath(path_str)ifpath.is_absolute():print(f{path_str}是绝对路径)# 输出: /home/user/file.txt 是绝对路径else:print(f{path_str}是相对路径)# 输出: docs/file.txt 是相对路径# 转换为绝对路径print(f绝对路径:{path.resolve()})# 示例3跨平台路径处理defhandle_paths():# 使用 os.path 处理跨平台路径rel_pathdata/upload/images/photo.jpg# 获取绝对路径自动适配操作系统abs_pathos.path.abspath(rel_path)print(f绝对路径:{abs_path})# Windows: C:\current\dir\data\upload\images\photo.jpg# Linux: /current/dir/data/upload/images/photo.jpg# 判断是否为绝对路径print(os.path.isabs(/home/file.txt))# Trueprint(os.path.isabs(file.txt))# False# 示例4文件操作中的路径使用deffile_operations():# 假设当前目录: /home/user/project# 使用相对路径读取文件相对于当前工作目录withopen(data/input.txt,r)asf:contentf.read()# 使用绝对路径写入文件output_path/tmp/output.txtwithopen(output_path,w)asf:f.write(content)# 推荐使用 Path 对象base_dirPath(__file__).parent# 脚本所在目录data_dirbase_dir/data# 创建目录使用绝对路径data_dir.mkdir(parentsTrue,exist_okTrue)# 读写文件使用绝对路径file_pathdata_dir/result.txtfile_path.write_text(Hello, World!)五、路径查找示例frompathlibimportPathdefdemo_path_navigation():演示路径导航# 当前目录结构假设:# /home/user/project/# ├── main.py# ├── data/# │ └── config.json# └── utils/# └── helper.pycurrentPath.cwd()print(f当前:{current})# 当前: /home/user/project# 访问子目录data_pathcurrent/dataprint(fdata目录:{data_path})# data目录: /home/user/project/data# 访问父目录parentcurrent.parentprint(f父目录:{parent})# 父目录: /home/user# 访问兄弟目录siblingcurrent.parent/other_projectprint(f兄弟目录:{sibling})# 兄弟目录: /home/user/other_project# 向上多级grandparentcurrent.parent.parentprint(f祖父目录:{grandparent})# 祖父目录: /home# 回到当前目录的深层子目录deep_pathcurrent/data/backup/2026/file.logprint(f深层路径:{deep_path})# 深层路径: /home/user/project/data/backup/2026/file.logdeffind_file_demo():演示文件查找# 在相对路径中查找frompathlibimportPath# 查找当前目录下的 Python 文件forpy_fileinPath(.).glob(*.py):print(f找到:{py_file})print(f 绝对路径:{py_file.resolve()})# 查找上一级目录的所有配置文件forconfiginPath(..).glob(*.yaml):print(f配置文件:{config})六、实际应用场景场景1配置文件加载推荐模式frompathlibimportPathclassConfig:def__init__(self):# 获取项目根目录假设脚本在项目根目录下self.project_rootPath(__file__).parent self.config_dirself.project_root/configdefget_config(self,name):# 使用相对路径相对于项目根目录config_pathself.config_dir/f{name}.yamlifnotconfig_path.exists():raiseFileNotFoundError(f配置文件不存在:{config_path})# 返回绝对路径returnconfig_path.resolve()# 使用configConfig()pathconfig.get_config(database)print(path)# /home/user/project/config/database.yaml场景2批量处理相对路径文件frompathlibimportPathdefprocess_relative_files():处理相对路径下的所有文件base_dirPath(./uploads)# 相对路径ifnotbase_dir.exists():print(f目录不存在:{base_dir.absolute()})returnforfile_pathinbase_dir.rglob(*.txt):# 获取相对于当前工作目录的路径relfile_path.relative_to(Path.cwd())print(f相对路径:{rel})# 获取绝对路径abs_pathfile_path.absolute()print(f绝对路径:{abs_path})# 实际处理文件withfile_path.open(r)asf:contentf.read()场景3路径规范化frompathlibimportPathdefnormalize_examples():演示路径规范化# 包含 . 和 .. 的路径messy_pathPath(./project/data/../backup/./file.txt)# resolve() 会消除 . 和 ..并返回绝对路径clean_pathmessy_path.resolve()print(f规范化前:{messy_path})# project/data/../backup/./file.txtprint(f规范化后:{clean_path})# /current/path/project/backup/file.txt# 使用 pure path 规范化不检查文件系统frompathlibimportPurePath purePurePath(foo/bar/../baz)print(PurePath(foo,bar,..,baz))# foo/baz# os.path 规范化importos.path normos.path.normpath(/home/user/../other/./file)print(norm)# /home/other/file七、最佳实践建议✅ 推荐做法frompathlibimportPath# 1. 使用基于当前文件的相对路径更可靠config_dirPath(__file__).parent/config# 2. 明确路径类型defread_file(file_path:Path):ifnotfile_path.is_absolute():file_pathPath.cwd()/file_pathreturnfile_path.read_text()# 3. 使用 resolve() 获得规范化的绝对路径abs_pathPath(./data/../config.ini).resolve()# 4. 跨平台使用 Path 对象data_filePath(data)/output/result.csv❌ 避免的做法# 1. 避免硬编码绝对路径降低可移植性# 不推荐fileopen(C:/Users/John/project/data.txt)# 推荐fileopen(Path(__file__).parent/data.txt)# 2. 避免假设当前工作目录# 不推荐withopen(config.json)asf:# 依赖于执行位置pass# 推荐config_pathPath(__file__).parent/config.jsonwithconfig_path.open()asf:pass# 3. 避免手动拼接路径字符串# 不推荐pathfolder/filename# 推荐pathPath(folder)/filename八、常见问题Q: 为什么我的相对路径找不到文件A: 相对路径是相对于当前工作目录不是相对于脚本文件。使用Path(__file__).parent获取脚本所在目录。Q: 如何判断路径是绝对还是相对A: 使用os.path.isabs()或 Path 的.is_absolute()方法。Q: 跨平台路径分隔符问题A: 使用os.path.join()或pathlib.Path自动处理。Q:./可以省略吗A: 可以./file.txt和file.txt含义相同但./有时用于明确表示相对路径。理解绝对路径和相对路径的区别对于编写可移植、可维护的文件处理代码至关重要