Windows文件路径同时出现正斜杠与反斜杠的原因及解决方法
问题:glob模块获取的文件路径同时包含正斜杠和反斜杠
代码示例
import glob import xml.etree.ElementTree as xet # 补充代码中用到的模块导入 path = glob('./images/*.xml') print(path) labels_dict = dict(filepath=[],xmin=[],xmax=[],ymin=[],ymax=[]) for filename in path: print(filename) info = xet.parse(filename) root = info.getroot() member_object = root.find('object') labels_info = member_object.find('bndbox') xmin = int(labels_info.find('xmin').text) xmax = int(labels_info.find('xmax').text) ymin = int(labels_info.find('ymin').text) ymax = int(labels_info.find('ymax').text) labels_dict['filepath'].append(filename) labels_dict['xmin'].append(xmin) labels_dict['xmax'].append(xmax) labels_dict['ymin'].append(ymin) labels_dict['ymax'].append(ymax)
运行结果
['./images\\N1.xml', './images\\N100.xml'] ./images\N1.xml ./images\N100.xml
原因
你是在Windows系统上运行代码:glob模块会自动适配系统默认的路径分隔符(Windows用反斜杠\),但你传入的匹配路径用了正斜杠./images/*.xml,所以返回的路径保留了输入的正斜杠前缀,同时将匹配到的文件名部分替换为系统的反斜杠,最终导致两种分隔符混合出现。
解决方法
方法一:用pathlib统一处理路径(推荐)
Python 3.4+自带的pathlib模块可跨系统统一处理路径,自动适配分隔符,代码修改如下:from pathlib import Path import xml.etree.ElementTree as xet # 获取路径对象列表 path_objects = list(Path('./images').glob('*.xml')) # 转成字符串格式路径(自动使用系统分隔符) path = [str(p) for p in path_objects] print(path) labels_dict = dict(filepath=[],xmin=[],xmax=[],ymin=[],ymax=[]) for filename in path_objects: # 也可直接用路径对象解析xml print(filename) info = xet.parse(filename) # 后续逻辑保持不变如果想强制使用正斜杠,改用
as_posix()方法:path = [p.as_posix() for p in Path('./images').glob('*.xml')]方法二:用os.path模块标准化路径
利用os.path.normpath()将混合路径转换为系统标准格式:import os import glob import xml.etree.ElementTree as xet path = glob.glob('./images/*.xml') # 统一转换为系统标准路径 path = [os.path.normpath(p) for p in path] print(path) # 后续处理逻辑不变os.path.abspath()也能达到类似效果,同时会将相对路径转为绝对路径。方法三:手动替换分隔符
如果想强制统一使用正斜杠,直接做字符串替换:import glob import xml.etree.ElementTree as xet path = glob.glob('./images/*.xml') path = [p.replace('\\', '/') for p in path] print(path) # 后续处理逻辑不变
内容的提问来源于stack exchange,提问作者Rony Shaji
相关产品推荐
相关产品推荐

