Python pathlib是否有便捷方法实现路径与文件转换?含Pandas CSV场景
解决pathlib跨目录路径构建问题,结合Pandas读写CSV
核心问题出在你依赖了Path.cwd()——当前工作目录,一旦运行脚本的目录改变,路径就会失效。正确的做法是基于脚本文件的实际位置构建绝对路径,不管在哪运行都能准确定位到项目内的文件。
修正路径构建函数
首先修正path_to函数,用__file__获取当前脚本的路径,以此为基准定位项目根目录:
import pathlib from typing import Path def path_to(subdir: str, name: str) -> Path: """从项目根目录定位到指定子目录下的文件""" # 获取当前脚本所在的src目录(绝对路径) src_dir = pathlib.Path(__file__).parent.resolve() # 向上跳一级到项目根目录 project_root = src_dir.parent # 拼接目标子目录和文件名 return project_root / subdir / name
注:原来的函数返回类型标注错误,应该返回
Path而非TextIO,这里一并修正。
调用代码无需大改
Pandas的read_csv(以及to_csv)直接支持Path对象,所以你的get_files函数可以直接沿用,完全兼容:
import pandas as pd def get_files(f, dir1): """从指定子目录读取文件并转为DataFrame""" file_1 = path_to(dir1, f) try: df = pd.read_csv( file_1, encoding="UTF-8", infer_datetime_format=True, thousands=",", index_col=False, ) except FileNotFoundError: df = pd.DataFrame(columns=col_save_all) return df
如果需要写入CSV,同样直接传Path对象即可:
df.to_csv(project_root / "output" / "result.csv", encoding="UTF-8", index=False)
额外优化建议
- 可以把项目根目录定义为常量,复用更方便:
PROJECT_ROOT = pathlib.Path(__file__).parent.parent.resolve() - 用
resolve()可以把相对路径转换为绝对路径,避免路径歧义,同时自动处理..这类上级目录的写法。
内容的提问来源于stack exchange,提问作者Steve Maguire
相关产品推荐
相关产品推荐

