Skip to main content
 首页 » 编程设计

python之Python如何为同一个数据集给出不同的结果

2025年05月04日12jyk

我正在运行下面的代码。

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)