You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python Pandas实现CSV与XML文件数据差异校验及提示输出

CSV与XML数据同步校验实现(Python Pandas)

完整代码实现

import pandas as pd

def read_csv(file_path):
    # 读取CSV文件,兼容UTF-8/GBK编码解决中文乱码问题
    try:
        return pd.read_csv(file_path, encoding='utf-8')
    except UnicodeDecodeError:
        return pd.read_csv(file_path, encoding='gbk')

def read_xml(file_path, xpath='.//record'):
    # 读取XML文件,xpath参数指定需解析的目标节点(根据XML结构调整)
    return pd.read_xml(file_path, xpath=xpath)

def compare_files(df_csv, df_xml, primary_key):
    # 校验主键字段是否存在于两个数据集
    if primary_key not in df_csv.columns or primary_key not in df_xml.columns:
        print(f"错误:主键字段「{primary_key}」在其中一个文件中不存在")
        return
    
    # 提取公共字段作为对比子集,排除无关列干扰
    common_columns = list(set(df_csv.columns) & set(df_xml.columns))
    df_csv_subset = df_csv[common_columns].drop_duplicates().reset_index(drop=True)
    df_xml_subset = df_xml[common_columns].drop_duplicates().reset_index(drop=True)
    
    # 1. 检测单向缺失数据
    missing_in_csv = df_xml_subset.merge(
        df_csv_subset, on=primary_key, how='left', indicator=True
    ).query('_merge == "left_only"').drop('_merge', axis=1)
    
    missing_in_xml = df_csv_subset.merge(
        df_xml_subset, on=primary_key, how='left', indicator=True
    ).query('_merge == "left_only"').drop('_merge', axis=1)
    
    # 2. 检测内容不一致数据(主键存在但其他字段值不同)
    merged_df = pd.merge(
        df_csv_subset, df_xml_subset, on=primary_key, suffixes=('_csv', '_xml'), how='inner'
    )
    mismatch_mask = False
    for col in common_columns:
        if col == primary_key:
            continue
        mismatch_mask |= merged_df[f"{col}_csv"] != merged_df[f"{col}_xml"]
    mismatches = merged_df[mismatch_mask].reset_index(drop=True)
    
    # 输出校验结果
    print("=== 数据同步校验结果 ===")
    if not missing_in_csv.empty:
        print(f"\n1. CSV中缺失但XML存在的数据(共{len(missing_in_csv)}条):")
        print(missing_in_csv.to_string(index=False))
    if not missing_in_xml.empty:
        print(f"\n2. XML中缺失但CSV存在的数据(共{len(missing_in_xml)}条):")
        print(missing_in_xml.to_string(index=False))
    if not mismatches.empty:
        print(f"\n3. 双向存在但内容不一致的数据(共{len(mismatches)}条):")
        print(mismatches.to_string(index=False))
    if missing_in_csv.empty and missing_in_xml.empty and mismatches.empty:
        print("\n所有数据同步一致,未发现异常")

# 调用示例
if __name__ == "__main__":
    CSV_FILE = "your_data.csv"
    XML_FILE = "your_data.xml"
    PRIMARY_KEY = "id"  # 替换为数据的唯一标识字段(如ID、编码)
    
    csv_data = read_csv(CSV_FILE)
    xml_data = read_xml(XML_FILE)
    compare_files(csv_data, xml_data, PRIMARY_KEY)

关键逻辑说明

  • 文件读取:
    • CSV读取自动适配常见编码,避免中文乱码
    • XML读取支持自定义XPath,适配不同结构的XML文件(需根据实际节点调整xpath参数)
  • 数据对比:
    • 先提取两个文件的公共字段作为对比子集,排除无关列干扰
    • 用merge+indicator精准检测单向缺失的数据
    • 内连接合并后逐字段对比,筛选出内容不一致的行
  • 结果输出:分三类输出异常情况,无异常时直接提示同步一致

内容的提问来源于stack exchange,提问作者My Vö

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:43