如何将for循环打印结果转为指定列格式的pandas DataFrame
实现方案
之前用zip拼接写法失效的核心原因是没有在循环外侧定义统一的结果存储容器,循环过程中没有把每一组输出的字段按行收集,零散拼接自然无法得到结构正确的表。
推荐使用「循环外初始化空列表存储行记录 -> 循环内逐行追加结构化数据 -> 循环结束一次性转DataFrame」的实现方式,性能稳定且逻辑不易出错,完整可运行代码如下:
import os import datetime import pandas as pd import xml.etree.ElementTree as et # 循环外初始化空列表,存储所有行的结构化数据 result_rows = [] for filename in os.listdir("/data/rrd_dump_xml/"): if filename.endswith(".xml"): # 用os.path.join拼接路径,自动适配不同系统的路径分隔符 totaldir = os.path.join("/data/rrd_dump_xml/", filename) tree = et.parse(totaldir) root = tree.getroot() # 提取name字段 NAME = [] for name in root.iter('name'): NAME.append(name.text) # 提取并格式化最后更新时间 UPDATE = [] for update in root.iter('lastupdate'): UPDATE.append(update.text) updated = datetime.datetime.fromtimestamp(int(UPDATE[0])) lastupdate = updated.strftime('%Y-%m-%d %H:%M:%S') # 提取参数值 ParaValue = [] for parameterevalue in root.iter('value'): ParaValue.append(parameterevalue.text) # 每个文件对应2行记录,分别追加到结果列表 result_rows.append({ "filename": filename, "lastupdate": lastupdate, "Name": NAME[0], "Value": ParaValue[0] }) result_rows.append({ "filename": filename, "lastupdate": lastupdate, "Name": NAME[1], "Value": ParaValue[1] }) else: print(f"跳过非xml文件: {filename}") # 循环结束后一次性生成DataFrame,列名与需求完全匹配 df = pd.DataFrame(result_rows, columns=["filename", "lastupdate", "Name", "Value"]) # 可选:打印前5行验证结果正确性 print(df.head())
注意事项
- 不要在for循环内部逐行调用
df.append()或者重复构造DataFrame,这种写法性能极差,数据量大的时候运行速度会比先存列表最后转换的写法慢几十上百倍 - 上述代码默认每个xml文件至少包含2个
name节点和2个value节点,如果存在文件节点数不足的情况,可以在取索引前加len(NAME)>=2 and len(ParaValue)>=2的判断,避免抛出索引越界错误 - 如果需要保留非xml文件的错误记录,可以在else分支里也往
result_rows追加对应标记的行,后续统一处理即可
内容的提问来源于stack exchange,提问作者Codec737
相关产品推荐
相关产品推荐

