循环遍历XML并写入CSV时遇每行仅单字符问题求助
解决XML解析后导出CSV每行仅显示单个字符的问题
嘿,我来帮你搞定这个CSV导出的小bug!你说的情况我太熟悉了——控制台打印正常,但CSV每行只有单个字符,核心问题出在CSV写入的方式不对,咱们一步步来修正:
问题根源
Python的csv.writer里的writerow()方法,会把传入的可迭代对象拆成单个元素写入行。如果你直接把提取到的完整字符串传给它,字符串本身是可迭代的(会被拆成单个字符),自然就出现每行一个字符的情况了。
修正步骤&示例代码
假设你从XML里要提取的是多个字段(比如name、id、detail这类元素),正确的做法是把这些字段整理成列表/元组,再传给writerow()。这里给你补全并修正代码:
import xml.etree.ElementTree as ET import csv # 注意路径要用原始字符串或者转义反斜杠,避免转义字符问题 tree = ET.parse(r'C:\path\Recon.xml') root = tree.getroot() # 打开CSV文件,newline=''避免空行问题 with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile: # 定义表头(根据你要提取的字段修改) fieldnames = ['字段1', '字段2', '字段3'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # 先写入表头 writer.writeheader() # 遍历XML元素,提取所需内容 for item in root.findall('.//你的目标元素路径'): # 提取每个字段的内容,处理元素不存在的情况 field1 = item.find('字段1').text.strip() if item.find('字段1') is not None else '' field2 = item.find('字段2').text.strip() if item.find('字段2') is not None else '' field3 = item.find('字段3').text.strip() if item.find('字段3') is not None else '' # 方式1:用字典匹配表头写入 writer.writerow({'字段1': field1, '字段2': field2, '字段3': field3}) # 方式2:直接传列表(顺序要和表头一致) # writer.writerow([field1, field2, field3])
关键注意点
- 如果你的需求是把XML里的大段文本(单个长内容)写入CSV的一行一列,那要把文本放进列表里,比如
writer.writerow([long_text]),而不是直接传long_text。 - 路径里的反斜杠一定要处理:要么用原始字符串
r'C:\path\...',要么把反斜杠改成\\,不然会被Python当成转义字符(比如\R会被解析成特殊字符)。 - 用
with open()上下文管理器,能自动处理文件关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

