影刀RPA 文件路径处理os.path与pathlib署名林焱什么情况用什么RPA流程中处理大量文件操作——读取配置文件、保存采集数据、创建日志目录。路径处理不当会导致跨电脑运行失败、路径找不到等问题。场景推荐方式特点简单路径拼接os.path.join兼容性好现代路径操作pathlib.Path面向对象更优雅跨平台路径pathlib.Path自动适配分隔符怎么做一路径拼接importosfrompathlibimportPath# os.path方式 baserD:\项目configos.path.join(base,config,settings.json)# 结果: D:\项目\config\settings.json# pathlib方式推荐 basePath(rD:\项目)configbase/config/settings.json# 结果: D:\项目\config\settings.json# 动态拼接data_dirPath(rD:\项目)/data/2024/06二路径分解拼多多店群自动化上架方案frompathlibimportPath pathPath(rD:\项目\data\销售数据.xlsx)# 各部分print(path.parent)# D:\项目\data 父目录print(path.name)# 销售数据.xlsx 文件名含扩展名print(path.stem)# 销售数据 文件名不含扩展名print(path.suffix)# .xlsx 扩展名print(path.drive)# D: 盘符![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6e65c00959794bafa3187a526db4ef5a.png#pic_center)print(path.parts)# (D:\\, 项目, data, 销售数据.xlsx)# os.path等价写法importosprint(os.path.dirname(path))# 父目录print(os.path.basename(path))# 文件名print(os.path.splitext(path))# (D:\\项目\\data\\销售数据, .xlsx)三路径检查frompathlibimportPathimportos pathPath(rD:\项目\data\销售数据.xlsx)# 检查是否存在print(path.exists())# True/False# 检查是文件还是目录print(path.is_file())# 是文件print(path.is_dir())# 是目录# os.path等价os.path.exists(path)os.path.isfile(path)os.path.isdir(path)四创建目录frompathlibimportPath# 创建多级目录如果不存在output_dirPath(rD:\项目\output\2024\06\15)output_dir.mkdir(parentsTrue,exist_okTrue)# parentsTrue: 自动创建所有缺失的父目录# exist_okTrue: 目录已存在时不报错# os.makedirs等价importos os.makedirs(output_dir,exist_okTrue)五遍历目录frompathlibimportPath# 方法1列出目录下所有文件data_dirPath(rD:\项目\data)foritemindata_dir.iterdir():print(item.name,→,目录ifitem.is_dir()else文件)# 方法2递归遍历所有文件forfileindata_dir.rglob(*):iffile.is_file():print(file)# 方法3只找特定类型forxlsx_fileindata_dir.rglob(*.xlsx):print(xlsx_file)# 方法4排除临时文件forfileindata_dir.rglob(*.xlsx):ifnotfile.name.startswith(~$):print(file)完整流程文件路径管理工具frompathlibimportPathimportosfromdatetimeimportdatetimeclassPathManager:项目路径管理器自动适配不同电脑def__init__(self,base_dirNone):ifbase_dir:self.basePath(base_dir)else:# 默认项目目录在桌面\workbuddy下self.basePath.home()/Desktop/workbuddy# 子目录self.dataself.base/dataself.outputself.base/outputself.configself.base/configself.logsself.base/logsself.tempself.base/temp# 自动创建fordin[self.base,self.data,self.output,self.config,self.logs,self.temp]:d.mkdir(parentsTrue,exist_okTrue)defget_data_file(self,filename):获取数据文件路径returnself.data/filenamedefget_output_file(self,filename,date_subdirTrue):获取输出文件路径可按日期分目录ifdate_subdir:todaydatetime.now().strftime(%Y%m%d)out_dirself.output/today out_dir.mkdir(parentsTrue,exist_okTrue)returnout_dir/filenamereturnself.output/filenamedefget_config_path(self,filenameconfig.yaml):获取配置文件路径returnself.config/filenamedefget_log_path(self,nameflow):获取日志文件路径todaydatetime.now().strftime(%Y-%m-%d)returnself.logs/f{name}_{today}.logdefclean_temp(self,days7):清理temp目录中超过N天的文件importtime cutofftime.time()-days*86400cleaned0forfileinself.temp.rglob(*):iffile.is_file()andfile.stat().st_mtimecutoff:file.unlink()cleaned1returncleaned# 使用pmPathManager()# 获取各种路径data_filepm.get_data_file(销售数据.xlsx)output_filepm.get_output_file(报告.xlsx)config_filepm.get_config_path()log_filepm.get_log_path(采集流程)print(f数据文件:{data_file})print(f输出文件:{output_file})print(f配置文件:{config_file})print(f日志文件:{log_file})有什么坑坑一Windows路径反斜杠被转义现象路径D:\new\data写成普通字符串后\n被当作换行符。原因Python字符串中\是转义字符\n是换行、\t是制表符。解决用原始字符串r前缀或pathlib# 正确1原始字符串pathrD:\new\data\file.xlsx# 正确2正斜杠Windows也支持pathD:/new/data/file.xlsx# 正确3pathlibpathPath(D:/new/data/file.xlsx)# 错误普通字符串# path D:\new\data\file.xlsx ❌ \n变成换行符坑二路径中包含中文或空格现象路径中有空格或中文时用subprocess执行命令报错。TEMU店群如何管理运营原因命令行参数中的空格会被当作参数分隔符。解决用引号包裹路径importsubprocess file_pathrD:\my data\测试文件.xlsx# 错误直接拼接# subprocess.run(fopen {file_path}) ❌ 空格导致参数分割# 正确用引号包裹subprocess.run(fopen {file_path},shellTrue)# 更好用列表传参subprocess.run([open,file_path])# pathlib也可以frompathlibimportPath pPath(file_path)subprocess.run([open,str(p)])坑三相对路径在不同工作目录下找不到文件现象在影刀中用相对路径data/input.xlsx运行时找不到文件。原因相对路径相对于当前工作目录而影刀的工作目录可能不是项目目录。解决用绝对路径或基于脚本位置的路径frompathlibimportPath# 方案1用绝对路径file_pathPath(rD:\项目\data\input.xlsx)# 方案2基于当前Python文件位置# __file__是当前脚本的路径script_dirPath(__file__).parentif__file__indir()elsePath.cwd()data_filescript_dir/data/input.xlsx# 方案3在影刀中用环境变量或配置文件指定项目根目录importos project_rootos.environ.get(RPA_PROJECT_ROOT,rD:\项目)data_filePath(project_root)/data/input.xlsx坑四路径大小写不敏感导致重复现象Windows上D:\Data\file.xlsx和D:\data\file.xlsx指向同一个文件但程序以为是两个。原因Windows文件系统大小写不敏感Linux/Mac大小写敏感。解决路径规范化处理frompathlibimportPath# 获取规范化的真实路径解析符号链接、大小写pathPath(rD:\Project\DATA\file.xlsx)real_pathpath.resolve()# resolve()会返回实际路径的大小写形式# 统一转小写进行比较path_lowerstr(path).lower()![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3c9db0e829914d388aed9a079a57360d.png#pic_center)# 去重时用规范化路径seenset()forfileinfiles:realstr(Path(file).resolve()).lower()ifrealnotinseen:seen.add(real)# 处理文件