繁体   English   中英

枚举CSV中属于python中相同标签(键)的列标题

[英]enumerate column headers in CSV that belong to the same tag (key) in python

我正在使用以下几组生成器将XML解析为CSV:

import xml.etree.cElementTree as ElementTree 
from xml.etree.ElementTree import XMLParser
import csv

def flatten_list(aList, prefix=''):
    for i, element in enumerate(aList, 1):
        eprefix = "{}{}".format(prefix, i)
        if element:
            # treat like dict 
            if len(element) == 1 or element[0].tag != element[1].tag: 
                yield from flatten_dict(element, eprefix)
            # treat like list 
            elif element[0].tag == element[1].tag: 
                yield from flatten_list(element, eprefix)
        elif element.text: 
            text = element.text.strip() 
            if text: 
                yield eprefix[:].rstrip('.'), element.text

def flatten_dict(parent_element, prefix=''):
    prefix = prefix + parent_element.tag 
    if parent_element.items():
        for k, v in parent_element.items():
            yield prefix + k, v
    for element in parent_element:
        eprefix = element.tag  
        if element:
            # treat like dict - we assume that if the first two tags 
            # in a series are different, then they are all different. 
            if len(element) == 1 or element[0].tag != element[1].tag: 
                yield from flatten_dict(element, prefix=prefix)
            # treat like list - we assume that if the first two tags 
            # in a series are the same, then the rest are the same. 
            else: 
                # here, we put the list in dictionary; the key is the 
                # tag name the list elements all share in common, and 
                # the value is the list itself
                yield from flatten_list(element, prefix=eprefix)
            # if the tag has attributes, add those to the dict
            if element.items():
                for k, v in element.items():
                    yield eprefix+k
        # this assumes that if you've got an attribute in a tag, 
        # you won't be having any text. This may or may not be a 
        # good idea -- time will tell. It works for the way we are 
        # currently doing XML configuration files... 
        elif element.items(): 
            for k, v in element.items():
                yield eprefix+k
        # finally, if there are no child tags and no attributes, extract 
        # the text 
        else:
            yield eprefix, element.text                

def makerows(pairs):

    headers = []
    columns = {}
    for k, v in pairs:
        if k in columns:
            columns[k].extend((v,))
        else:
            headers.append(k)
            columns[k] = [k, v]
    m = max(len(c) for c in columns.values())
    for c in columns.values():
        c.extend(' ' for i in range(len(c), m))
    L = [columns[k] for k in headers]
    rows = list(zip(*L))
    return rows      

def main():

    with open('2-Response_duplicate.xml', 'r', encoding='utf-8') as f: 
        xml_string = f.read() 
    xml_string= xml_string.replace('�', '') #optional to remove ampersands. 
    root = ElementTree.XML(xml_string) 
#     for key, value in flatten_dict(root):
#         key = key.rstrip('.').rsplit('.', 1)[-1]
#         print(key,value)
    writer = csv.writer(open("try5.csv", 'wt'))
    writer.writerows(makerows(flatten_dict(root)))

if __name__ == "__main__":
    main()

在Excel中打开时,CSV的一列如下所示:

对象向导

2adeb916-cc43-4d73-8c90-579dd4aa050a

2e77c588-56e5-4f3f-b990-548b89c09acb

c8743bdd-04a6-4635-aedd-684a153f02f0

1cdc3d86-f9f4-4a22-81e1-2ecc20f5e558

2c19d69b-26d3-4df0-8df4-8e293201656f

6d235c85-6a3e-4cb3-9a28-9c37355c02db

c34e05de-0b0c-44ee-8572-c8efaea4a5ee

9b0fe8f5-8ec4-4f13-b797-961036f92f19

1d43d35f-61ef-4df2-bbd9-30bf014f7e10

9cb132e8-bc69-4e4f-8f29-c1f503b50018

24fd77da-030c-4cb7-94f7-040b165191ce

0a949d4f-4f4c-467e-b0a0-40c16fc95a79

801d3091-c28e-44d2-b9bd-3bad99b32547

7f355633-426d-464b-bab9-6a294e95c5d5

这是由于存在14个名称为ObjectGuid的标签。 例如,这些标记之一如下所示:

<ObjectGuid>2adeb916-cc43-4d73-8c90-579dd4aa050a</ObjectGuid>

我的问题:有没有一种有效的方法来枚举标头(键),使得每个键都像其对应的值(XML数据结构中的文本)一样被枚举:

它将在Excel中显示如下:

ObjectGuid_1 ObjectGuid_2 ObejectGuid3等.....

如果您需要我提供其他信息(例如示例XML),请告诉我。 谢谢您的帮助。

为了标识的目的,在数据​​集本身中添加元素,属性或注释性描述符是错误的……仅当您拥有该数据并且100%知道这样做不会有任何结果时,才应该对数据进行规范化对其他使用者的负面影响(依赖属性顺序来操纵DOM的使用者)。 但是,如果通过对这个属性进行new属性的0(n)检查来获取哈希表查找的效率,那么使用dict或嵌套dict(我不太可能获得t)有什么意义呢? 该哈希处理的重点是随机查找。

如果仅是结构化的(键,值)对,那么在这里就有意义。为什么不只使用其他连续数据结构,而要像字典一样对待呢。说一个命名元组…

第二种解决方案是,如果要添加其他状态,则将生成器放在类中。

班级顺序:

    def__init__(self, lines, order): 
        self.lines = lines 
        self.order - python(max) 

    def __iter__(self): 
        for l, line in enumerate(self.lines, 1); 
        self.order.append(  l, line))  
        yield line 

when open (some file.csv) as f: 
    lines = oder( f); 

应对数据进行无害转换? 例如,如果要创建转换字典(请参见下文)

好吧,直到其中一个值是空白为止……

类型= [('x',float'),('y',float')

with open(‘some.csv’) as f: 
     for row in cvs.DictReader(f): 
          row.update((key, conversion (row [ key])) 
        for key, conversion in field_types) 


[x: ,y: 2.  2]  — > that is until there is an empty data point.. Kaboom. 

因此,我的建议不是更改或添加数据,而是更改处理此类数据的算法。如果问题是顺序,为什么不简单地将说一个元组作为类似于字典的命名元组,则警告是可变性但是在数据统一性上是有道理的...

*我不理解嵌套的字典……那是因为y标头值是吗?

值和顺序键->键->(键:值)? 或者你可以跳过

first row :p..
    So just skip the first row.. 

    for  line in {header: list, header: list }  
        line.next()  # problem solved.. or print(line , end = ‘’) 

    *** Notables 
-To iterator over multiple sequences in parallel 


 h = [a,b,c]
    x = [1,2,3]

    for i in zip(a,b): 
        print(i) 

    (a, 1) 
    (b, 2)

    -Chaining 

    a = [1,2 ,  3]
    b= [a, b ,  c ]enter code here
    for x in chain(a, b): 
        //remove white space 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM