如何读取含双分隔符的CSV并无损导入Excel?代码报错排查
XML对比后CSV读取异常的问题排查与修复
问题说明
对比两个XML文件后生成4个CSV文件,使用pandas的read_csv读取时出现数据丢失,提示存在bad lines,以下是原代码的错误排查和修复方案。
错误根源
非标准CSV格式导致解析失败
原代码用print直接输出文本到文件,生成的不是符合规范的CSV:- 文件开头包含描述性文本(如
common details Full Path:),会被pandas识别为无效行 - 每行仅单个数据,却指定
delimiter=';;',pandas解析逻辑混乱,触发bad lines跳过数据
- 文件开头包含描述性文本(如
函数返回值逻辑错误
non_match_elements函数中存在两个连续return,第二个return non_match_target永远无法执行,导致non_match_target始终为空,对应CSV无数据文件操作不规范
直接用open打开文件后未调用close(),可能导致数据未完全写入文件条件判断逻辑失效
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)
修复说明
- 生成标准CSV:使用pandas的
DataFrame.to_csv直接生成符合规范的CSV文件,包含表头,无多余描述文本,确保pandas可以正常解析 - 修复函数返回逻辑:修改
non_match_elements函数,一次性返回两个非匹配列表,确保数据能正确传递 - 规范文件操作:利用pandas的文件写入方法自动处理文件打开/关闭,避免数据写入不完整
- 修正条件判断:直接判断交集是否为空,逻辑更清晰准确
- 简化代码逻辑:用列表推导式替代循环,提升代码简洁性和效率
内容的提问来源于stack exchange,提问作者preksha VL
相关产品推荐
相关产品推荐

