Python字典列表追加异常问题及多XML数据收集需求
解决字典列表共享与多XML文件批量提取的问题
Hey there! Let's break down your problems and fix them step by step:
1. 修复字典所有键共享同一列表的问题
你遇到的核心问题是用dict.fromkeys()初始化字典时,所有键都共享同一个空列表对象——这就像多个变量指向同一个盒子,往任何一个盒子里放东西,所有变量看到的都是这个盒子的内容。
解决方法:用字典推导式生成独立列表
替换dict.fromkeys()的初始化方式,给每个键单独创建一个空列表:
RequiredTags = ['PolicyNumber', 'PaymentAmt', 'PolicyAmt'] ListOfTags = ['Header', 'Version','PolicyNumber', 'PaymentAmt', 'Body', 'PolicyAmt'] ListOfValues = ['', '1.1', '123456', '100.00', '', '1'] # 用字典推导式,每个键对应独立的空列表 values = {tag: [] for tag in RequiredTags} for key in values.keys(): if key in ListOfTags: idx = ListOfTags.index(key) v = ListOfValues[idx] values[key].append(v) print(values) # 输出: {'PolicyNumber': ['123456'], 'PaymentAmt': ['100.00'], 'PolicyAmt': ['1']}
为什么这能解决问题?
字典推导式{tag: [] for tag in RequiredTags}会为每个tag生成一个全新的空列表,每个键的列表都是独立的对象,追加值时只会影响对应键的列表。
2. 扩展到批量处理多个XML文件
要实现批量提取所有XML文件的对应值并追加到同一字典,我们可以结合文件遍历和XML解析来完成。这里以Python的xml.etree.ElementTree(内置库)为例,同时用glob来批量匹配XML文件:
完整代码示例
import glob import xml.etree.ElementTree as ET RequiredTags = ['PolicyNumber', 'PaymentAmt', 'PolicyAmt'] # 初始化存储所有文件数据的字典,每个键对应独立列表 values = {tag: [] for tag in RequiredTags} def extract_xml_values(file_path): """从单个XML文件中提取指定标签的值""" tree = ET.parse(file_path) root = tree.getroot() # 这里假设XML标签是直接子节点,你可以根据实际结构调整xpath或遍历逻辑 extracted = {} for tag in RequiredTags: element = root.find(tag) extracted[tag] = element.text if element is not None else "" return extracted # 遍历当前目录下所有.xml文件(可修改路径匹配规则) for xml_file in glob.glob("*.xml"): print(f"Processing {xml_file}...") file_values = extract_xml_values(xml_file) # 将当前文件的值追加到全局字典 for tag in RequiredTags: if file_values[tag]: # 可选:跳过空值 values[tag].append(file_values[tag]) # 打印最终结果 print("\nAll extracted values:") print(values)
关键说明:
- 文件遍历:
glob.glob("*.xml")会匹配当前目录下所有XML文件,如果你需要递归遍历子目录,可以用glob.glob("**/*.xml", recursive=True)。 - XML解析逻辑:
extract_xml_values函数需要根据你的XML实际结构调整——如果标签嵌套在子节点里,可能需要用root.find(".//" + tag)(递归查找)或者自定义的遍历逻辑。 - 数据追加:每次处理完一个文件,就把对应标签的值追加到全局字典的列表中,最终得到所有文件的汇总数据。
内容的提问来源于stack exchange,提问作者Naveenchandar
相关产品推荐
相关产品推荐

