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

Python脚本XML转CSV遇SyntaxError,求问题排查解决

问题排查:XML转CSV脚本SyntaxError错误

为客户项目执行XML转CSV转换时,使用Python在CMD运行脚本失败,出现SyntaxError。以下是相关文件及报错信息,排查过程如下:

待转换XML示例

<XML>
  <ClinicalData StudyOID="XXXXXXXXX" MetaDataVersionOID="53" mdsol_AuditSubCategoryName="QueryAnswer">
    <SubjectData SubjectKey="XXXXXXXX-b7cd-4f97-8d25-594219de192f" mdsol_SubjectKeyType="SubjectUUID" mdsol_SubjectName="XX-002">
      <SiteRef LocationOID="15" XXXX_StudyEnvSiteNumber="15" />
      <StudyEventData StudyEventOID="DAY1" StudyEventRepeatKey="DAY1[1]" mdsol_InstanceId="47077">
        <FormData FormOID="SS_DISP" FormRepeatKey="1" mdsol_DataPageId="320656">
          <ItemGroupData ItemGroupOID="SS_DISP" mdsol_RecordId="797737">
            <ItemData ItemOID="SS_DISP.DISPDAT" TransactionType="Upsert">
              <AuditRecord>
                <UserRef UserOID="XXXX@XXXXX.com1" />
                <LocationRef LocationOID="15" mdsol_StudyEnvSiteNumber="15" />
                <DateTimeStamp>2022-01-28T05:27:54</DateTimeStamp>
                <ReasonForChange>
                </ReasonForChange>
                <SourceID>12345678</SourceID>
              </AuditRecord>
              <mdsol_Query QueryRepeatKey="123456" Value="Date of XXXX does not equal the XXXY Date. Please review and correct else clarify." Status="Answered" Response="Issues with XXXXX IWRS XXXXXX" />
            </ItemData>
          </ItemGroupData>
        </FormData>
      </StudyEventData>
    </SubjectData>
  </ClinicalData>
</XML>

原Python脚本

from xml.etree import ElementTree
tree = ElementTree.parse('xml.xml')
root = tree.getroot()
data = []
for ClinicalData in root:
 StudyOID = getattr(child.find('StudyOID'), 'text', None)
 MetaDataVersionOID = getattr(child.find('MetaDataVersionOID'), 'text', None)
 mdsol_AuditSubCategoryName = getattr(child.find('mdsol_AuditSubCategoryName'), 'text', None)
 SubjectKey = getattr(child.find('SubjectKey'), 'text', None)
 #print('{}, {}, {}, {}'.format(StudyOID, MetaDataVersionOID, mdsol_AuditSubCategoryName, SubjectKey))
 data.append('{}, {}, {}, {}'.format(StudyOID, MetaDataVersionOID, mdsol_AuditSubCategoryName, SubjectKey))
#print (data)
with open('output.csv', 'w') as f: f.write('\n'.join([row for row in data[1:]]))

报错信息

File "<stdin>", line 9
with open('output.csv', 'w') as f: f.write('\n'.join([row for row in data[1:]]))
^^^^

SyntaxError: invalid syntax

错误原因

  1. 缩进不规范:Python对代码块缩进有严格要求,原脚本for循环内的所有代码未缩进,直接导致语法解析失败。
  2. 变量未定义:循环中使用child变量,但循环声明的变量是ClinicalData,变量名不匹配,即使修复缩进也会触发NameError。
  3. 属性获取逻辑错误:StudyOID、MetaDataVersionOID等是ClinicalData元素的属性,并非子元素,原脚本用find()查找子元素会返回None,无法获取目标值。
  4. CSV处理不严谨:直接用字符串拼接生成CSV,未处理字段中的逗号或空值,且data[1:]会丢弃第一条数据,不符合常规转换需求。

修正后的脚本

使用Python标准csv模块规范处理输出,同时修正缩进和属性获取逻辑:

import csv
from xml.etree import ElementTree

tree = ElementTree.parse('xml.xml')
root = tree.getroot()

# 定义CSV表头
headers = ['StudyOID', 'MetaDataVersionOID', 'mdsol_AuditSubCategoryName', 'SubjectKey']

with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(headers)
    
    for clinical_data in root:
        # 获取ClinicalData的属性
        study_oid = clinical_data.get('StudyOID')
        meta_version = clinical_data.get('MetaDataVersionOID')
        audit_subcat = clinical_data.get('mdsol_AuditSubCategoryName')
        # 获取SubjectData的SubjectKey属性
        subject_data = clinical_data.find('SubjectData')
        subject_key = subject_data.get('SubjectKey') if subject_data is not None else None
        
        # 写入一行数据
        writer.writerow([study_oid, meta_version, audit_subcat, subject_key])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:25:19