Python configparser读取ini中Windows路径反斜杠转义问题
问题根因
你当前的配置写法把备份路径直接作为[folders]段下的无值键名存储,而INI格式语法中,=和:都是configparser默认的键值分隔符。Windows盘符路径自带的:(比如Z:\Desktop\winpython里的Z:)会被识别为键值分割标记,最终只把冒号前的Z解析为键名,传入tarfile后自然会提示找不到名为'Z'的文件,和反斜杠转义没有直接关系。
解决方案
可任选以下一种方案修复,优先选择跨平台兼容的实现:
方案1:改配置为标准键值对格式(最稳妥,无兼容问题)
不要把路径当键名书写,改成标准键值对格式,从根源避开冒号被识别为分隔符的问题;读取时开启原始字符串模式,不做任何转义、插值处理,效果和硬编码r''原始字符串完全一致。
修正后的backupcfg.ini示例
[folders] # Linux路径示例 path1 = /home/david/docs path2 = /home/david/images path3 = /home/david/videos # Windows路径示例,直接写单反斜杠即可,不需要手动转义 path4 = Z:\Desktop\winpython path5 = Z:\images\family [ftp] username=etc password=pwd
对应读取代码
import configparser import datetime import tarfile import os config = configparser.ConfigParser(allow_no_value=True) config.optionxform = lambda option: option # 保留路径大小写 config.read('backupcfg.ini') filelistings = [] # 遍历folders段下所有配置项,读取原始路径值 for path_key in config.options("folders"): # raw=True表示直接返回原始字符串,不做转义、插值处理 folder_path = config.get("folders", path_key, raw=True) # 自动规范化路径分隔符,适配Windows/Linux系统 filelistings.append(os.path.normpath(folder_path.strip("'"))) now = datetime.datetime.now() zipname = f'backup.{now.strftime("%Y.%m.%d")}.tgz' with tarfile.open(zipname, "w:gz") as tar: for path in filelistings: print(f"Adding {path}") tar.add(path)
方案2:保留原有配置结构,修改代码解析规则
如果你想保持「[folders]下每行直接写一个路径」的书写习惯,只需要在初始化configparser时,手动指定仅将=作为键值分隔符,不再识别冒号为分隔符即可:
# 关键配置:delimiters指定只认等号为键值分隔符,interpolation=None关闭插值转义 config = configparser.ConfigParser( allow_no_value=True, delimiters=('=',), interpolation=None ) config.optionxform = lambda option: option config.read('backupcfg.ini')
调整后ini里的路径可以直接按原有格式书写,Windows路径写单反斜杠、正斜杠都能被完整读取,读取后同样用os.path.normpath()做路径规范化即可,不需要硬编码r前缀。
注意:Windows系统原生API完全支持正斜杠
/作为路径分隔符,跨平台脚本统一用正斜杠写路径可以减少很多分隔符适配问题。
内容的提问来源于stack exchange,提问作者David Lloret
相关产品推荐
相关产品推荐

