我正在运行下面的代码。
import xml.etree.ElementTree as ET
import csv
tree = ET.parse('C:\\path\\Recon.xml')
root = tree.getroot()
with open('C:\\path\\data.txt', 'w') as f:
writer = csv.writer(f)
for neighbor in root.iter('outputColumn'):
writer.writerow(neighbor.attrib)
print(neighbor.attrib)
在控制台窗口中我看到了这个:
{'refId': 'Package\\RAW DATA PORTFOLIO SPLIT\\Sequence Container\\RAW DATA WHOLESALE\\TBL_FR2052A_RAW_DATA_P_WHOLESALE.Outputs[OLE DB Destination Error Output].Columns[ErrorColumn]', 'dataType': 'i4', 'lineageId': 'Package\\RAW DATA PORTFOLIO SPLIT\\Sequence Container\\RAW DATA WHOLESALE\\TBL_FR2052A_RAW_DATA_P_WHOLESALE.Outputs[OLE DB Destination Error Output].Columns[ErrorColumn]', 'name': 'ErrorColumn', 'specialFlags': '2'}
在文本文件中我看到了这个:
refId,dataType,lineageId,name,specialFlags
打印的内容完全正确。我希望在文本文件中看到相同的内容,但它完全不同。我怎样才能让作者写下正在打印的内容?
请您参考如下方法:
neighbor.attrib 是一个 dict。 writerow 采用任意迭代,iter(neighbor.attrib) 返回 dict 的 keys。另一方面,print 不需要可迭代的参数;它只是把它变成一个字符串。
不过,不清楚您希望 writer.writerow 产生什么。也许只是值(value)观?在这种情况下,使用
ordered_keys = ["refId", "dataType", "lineageId", "name", "specialFlags"] # Or whatever order you want
for neighbor in root.iter('outputColumn'):
writer.writerow([neighbor.attrib[k] for k in ordered_keys])
另一种选择是
ordered_keys = ["refId", "dataType", "lineageId", "name", "specialFlags"] # Or whatever order you want
values_of = operator.itemgetter(*ordered_keys)
for neighbor in root.iter('outputColumn'):
writer.writerow(values_of(neighbor.attrib))
不过,最简单的方法是使用 csv.DictWriter;他们可以将您的dict直接传递给writerow。
ordered_keys = ...
writer = csv.DictWriter(f, ordered_keys)
for neighbor in root.iter('outputColumn'):
writer.writerow(neighbor.attrib)
