Python pandas读写Excel硬编码路径如何实现跨设备通用
路径硬编码改造方案
核心思路是完全替换写死的绝对路径字符串,通过系统原生接口动态获取当前用户的标准目录路径,配合自动路径拼接、文件检索逻辑,适配所有Windows设备,不需要针对不同电脑修改代码。
基础依赖说明
所有用到的路径处理能力均来自Python 3.4+版本自带的标准库,不需要额外安装第三方包:
pathlib:自动适配Windows/macOS的路径分隔符,避免手动拼接斜杠/反斜杠导致的报错- Windows API调用模块:精准获取用户自定义过位置的桌面、文档文件夹(比如很多用户会把桌面移到非系统盘,手动拼接路径会失效)
导入逻辑改造:动态定位桌面+自动匹配目标文件
改造后的代码会自动获取当前用户的桌面路径,递归检索桌面下所有xlsx文件,按关键词匹配你需要的导入文件,不需要写死完整文件名、文件夹名里的日期或版本号:
import pandas as pd from pathlib import Path import ctypes from ctypes import wintypes # 调用Windows系统接口获取标准文件夹真实路径,适配修改过默认存储位置的用户 def get_known_folder_path(folder_id): buf = ctypes.create_unicode_buffer(wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(None, folder_id, None, 0, buf) return Path(buf.value) # 系统文件夹ID常量:桌面对应0x0000,我的文档对应0x0005 DESKTOP_PATH = get_known_folder_path(0x0000) # *轻量替代写法:不需要考虑用户改默认文件夹位置的话,直接用下面这行即可,适配90%以上普通场景 # DESKTOP_PATH = Path.home() / "Desktop" # 自动检索目标xlsx文件:匹配文件名包含"Katalog_CJM"的xlsx target_import_file = None # rglob表示递归遍历桌面所有子文件夹,如果文件直接放在桌面根目录,换成glob("*.xlsx")即可 for file in DESKTOP_PATH.rglob("*.xlsx"): if "Katalog_CJM" in file.name: target_import_file = file break # 找不到文件时抛出明确提示,避免出现晦涩的路径不存在报错 if not target_import_file: raise FileNotFoundError("未在桌面及子目录下找到文件名包含Katalog_CJM的xlsx文件,请检查文件存放位置") # 读取文件,路径完全动态生成 katalog_CJM = pd.read_excel( target_import_file, sheet_name='Katalog' )
如果需要匹配特定名称的子文件夹(比如你原来路径里带可变日期的
Catalogue - 20.07.-09.08.2022 - EXAMPLE文件夹),可以在遍历逻辑里加文件夹名关键词判断,不需要写死完整日期字符串。
导出逻辑改造:自动创建目录+适配任意用户路径
导出时同样动态拼接目标路径,如果目标导出文件夹不存在,代码会自动创建,不会抛出路径不存在的错误。示例代码实现导出到桌面的指定文件夹:
# 定义导出目录,依然基于动态获取的桌面路径 export_dir = DESKTOP_PATH / "EXPORT_PO_DOBAVLJACIMA" # 目录不存在则自动创建,exist_ok=True表示目录已存在时不报错 export_dir.mkdir(exist_ok=True) # 拼接导出文件的完整路径 export_file_path = export_dir / "Venera.xlsx" # 执行导出 Venera_merge.to_excel( export_file_path, index=False ) print(f"文件导出完成,存储路径:{export_file_path}")
如果需要导出到「我的文档」目录,只要替换路径获取逻辑即可:
DOCS_PATH = get_known_folder_path(0x0005) export_dir = DOCS_PATH / "EXPORT_PO_DOBAVLJACIMA"
可选:相对路径方案(适合脚本+数据打包分发场景)
如果你打算把脚本和数据文件打包成压缩包发给其他人使用,不需要用户把文件放到指定位置,只要保持压缩包内的文件相对位置不变,就可以基于脚本自身的位置做相对路径定位,兼容性最强:
# 获取当前运行的py脚本所在的文件夹绝对路径 SCRIPT_FOLDER = Path(__file__).parent.resolve() # 比如导入文件存放在脚本同级的data文件夹下,直接拼接相对路径 import_file = SCRIPT_FOLDER / "data" / "katalog_source.xlsx" # 导出文件存放在脚本同级的export文件夹下 export_dir = SCRIPT_FOLDER / "export" export_dir.mkdir(exist_ok=True)
注意事项
- 所有路径拼接统一用
pathlib的/运算符,不要手动拼接\或/符号 - 文件匹配尽量用关键词规则,不要写死带版本、日期的完整文件名,后续更新文件时不需要修改代码
- 涉及文件读写的逻辑前加存在性判断,出错时给出明确提示,降低排查成本
内容的提问来源于stack exchange,提问作者Adi Šehić
相关产品推荐
相关产品推荐

