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

如何读取含双分隔符的CSV并无损导入Excel?代码报错排查

XML对比后CSV读取异常的问题排查与修复

问题说明

对比两个XML文件后生成4个CSV文件,使用pandas的read_csv读取时出现数据丢失,提示存在bad lines,以下是原代码的错误排查和修复方案。

错误根源

  1. 非标准CSV格式导致解析失败
    原代码用print直接输出文本到文件,生成的不是符合规范的CSV:

    • 文件开头包含描述性文本(如common details Full Path:),会被pandas识别为无效行
    • 每行仅单个数据,却指定delimiter=';;',pandas解析逻辑混乱,触发bad lines跳过数据
  2. 函数返回值逻辑错误
    non_match_elements函数中存在两个连续return,第二个return non_match_target永远无法执行,导致non_match_target始终为空,对应CSV无数据

  3. 文件操作不规范
    直接用open打开文件后未调用close(),可能导致数据未完全写入文件

  4. 条件判断逻辑失效
    match函数中的if (Base_fullPath_set & Target_fullPath_set, Base_name_set & Target_name_set)是元组判断,无论交集是否为空都会返回True,逻辑不准确

修复后的完整代码

from lxml import etree
import pandas as pd

# 解析XML文件
Base = etree.parse('Base.xml')
Target = etree.parse('Target.xml')

# 提取所需属性
Base_fullPath = Base.xpath("//Member/@fullPath")
Target_fullPath = Target.xpath("//Member/@fullPath")
Base_name = Base.xpath("//Member/@name")
Target_name = Target.xpath("//Member/@name")

def match(Base_fullPath, Target_fullPath, Base_name, Target_name):
    # 计算交集
    common_fullPath = set(Base_fullPath) & set(Target_fullPath)
    common_name = set(Base_name) & set(Target_name)
    
    # 生成标准CSV(用DataFrame直接写入)
    if common_fullPath:
        pd.DataFrame({'Common FullPath': list(common_fullPath)}).to_csv(
            'C:\\Users\\pvl\\Desktop\\New folder\\Common_FullPath.csv', 
            index=False, encoding='utf-8'
        )
    if common_name:
        pd.DataFrame({'Common Name': list(common_name)}).to_csv(
            'C:\\Users\\pvl\\Desktop\\New folder\\Common_name.csv', 
            index=False, encoding='utf-8'
        )
    if not common_fullPath and not common_name:
        print("No Matches Found")

match(Base_fullPath, Target_fullPath, Base_name, Target_name)

def non_match_elements(list_base, list_target):
    non_match_base = [i for i in list_base if i not in list_target]
    non_match_target = [i for i in list_target if i not in list_base]
    # 一次性返回两个结果
    return non_match_base, non_match_target

list_base = Base.xpath("//Member/@*")
list_target = Target.xpath("//Member/@*")

# 获取两个非匹配列表
non_match_base, non_match_target = non_match_elements(list_base, list_target)

# 写入非匹配数据CSV
pd.DataFrame({'Present in Base': non_match_base}).to_csv(
    'C:\\Users\\pvl\\Desktop\\New folder\\Present_in_base.csv', 
    index=False, encoding='utf-8'
)
pd.DataFrame({'Present in Target': non_match_target}).to_csv(
    'C:\\Users\\pvl\\Desktop\\New folder\\Present_in_target.csv', 
    index=False, encoding='utf-8'
)

# 读取CSV并合并为Excel
with pd.ExcelWriter("C:\\Users\\pvl\\Desktop\\New folder\\combined.xlsx") as writer:
    pd.read_csv('C:\\Users\\pvl\\Desktop\\New folder\\Common_name.csv').to_excel(writer, sheet_name="Common_name", index=False)
    pd.read_csv('C:\\Users\\pvl\\Desktop\\New folder\\Present_in_base.csv').to_excel(writer, sheet_name="base_Details", index=False)
    pd.read_csv('C:\\Users\\pvl\\Desktop\\New folder\\Present_in_target.csv').to_excel(writer, sheet_name="target_Details", index=False)
    pd.read_csv('C:\\Users\\pvl\\Desktop\\New folder\\Common_FullPath.csv').to_excel(writer, sheet_name="Full_path", index=False)

修复说明

  1. 生成标准CSV:使用pandas的DataFrame.to_csv直接生成符合规范的CSV文件,包含表头,无多余描述文本,确保pandas可以正常解析
  2. 修复函数返回逻辑:修改non_match_elements函数,一次性返回两个非匹配列表,确保数据能正确传递
  3. 规范文件操作:利用pandas的文件写入方法自动处理文件打开/关闭,避免数据写入不完整
  4. 修正条件判断:直接判断交集是否为空,逻辑更清晰准确
  5. 简化代码逻辑:用列表推导式替代循环,提升代码简洁性和效率

内容的提问来源于stack exchange,提问作者preksha VL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:15:16