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
错误原因
- 缩进不规范:Python对代码块缩进有严格要求,原脚本
for循环内的所有代码未缩进,直接导致语法解析失败。 - 变量未定义:循环中使用
child变量,但循环声明的变量是ClinicalData,变量名不匹配,即使修复缩进也会触发NameError。 - 属性获取逻辑错误:
StudyOID、MetaDataVersionOID等是ClinicalData元素的属性,并非子元素,原脚本用find()查找子元素会返回None,无法获取目标值。 - 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
相关产品推荐
相关产品推荐

