繁体   English   中英

"Python:使用多个标题行写入 CSV"

[英]Python: Write to CSV with multiple header rows

语境<\/h3>

我正在寻找一个包含字典列表的字典作为每个键的值:值<\/em>对:

所需的输出将是一个 .csv 文件,其中包含第一个字典的键(key_1、key_2 等)作为第一个标题行,然后是嵌套字典的键(key_a、key_b 等)作为第二个标题行,对应于其各自的键。

所需输出的示例如下所示,其中列表索引列指的是存储在字典中字典列表中每个相应索引处的数据:

 
       
平台:<\/em><\/strong>树莓派 3b+、Python 3.6

<\/blockquote>


代码<\/h3>

目前,我正在研究执行此操作的不同选项,因此没有任何接近工作的连贯代码。 但是,按照优先顺序,我正在考虑以下几个选项:

  • 使用 pandas 形成一个反映所需表性质的数组。 然后直接将其写入CSV。

  • 从上述字典数据结构写入 CSV。

    很明显,此代码需要进一步开发以使其按预期工作。

    <\/li>

  • 另一种我没有考虑过的方法?


    问题<\/h3>

    以这种格式写入 CSV 的最佳方法是什么?

    "

到目前为止,我已经到达这里:

d = {'key_1':
    [{'key_a': 'foo_1', 'key_b': 'bar_1'}, 
     {'key_a': 'foo_2', 'key_b': 'bar_2'}], 
    'key_2':
    [{'key_c': 'foo_1', 'key_d': 'bar_1'}, 
     {'key_c': 'foo_2', 'key_d': 'bar_2'}]}
df = pd.DataFrame(d)
df1 = []
for col in df.columns:
    data = df[col].apply(pd.Series)
    data = df1.append(data)
df1 = pd.concat(df1,axis=1)
print(df1)

这给你:

  key_a   key_b    key_c     key_d
0 foo_1   bar_1    foo_1     bar_1 
1 foo_2   bar_2    foo_2     bar_2 

剩下的就是您必须映射与原始列名有关的各个键,并且tat可以作为标识符放置在df1.loc[-1]中。 知道后,我会更新。

在这里,您的“列表索引”是一个合并的单元格,由于它不包含格式,因此您无法在CSV文件中实现。 您可以:

a)将其写入xlsx文件( XlsxWriter是一个很棒的库)

b)保持为CSV,但如anky_91所示,具有未合并的单元格

这是为包含字典和字典列表的字典创建DictWriter()<\/code> fieldnames<\/code>名的解决方案。

您需要遍历结构并生成fieldnames<\/code>名称以及具有这些新名称的新dict<\/code> :

#!/usr/bin/env python3
import csv
import pprint as pp

myDict = {'key_1':
        [{'key_a': 'foo_1', 'key_b': 'bar_1'}, 
         {'key_a': 'foo_2', 'key_b': 'bar_2'}], 
        'key_2':
        [{'key_c': 'foo_1', 'key_d': 'bar_1'}, 
         {'key_c': 'foo_2', 'key_d': 'bar_2'}] }

def generateFieldnames(myDict):
    # create unique fieldnames from a dictionary containing dictionaries
    newDict={}
    fieldnames=[] # DictWriter will create a .csv with these header names
    
    for k,v in myDict.items():
        
        # is a dictionary?
        if (type(v) is dict):
            for kk,vv in v.items():
                print('k={0}, kk={1}, vv={2}'.format(k,kk,vv))
                name='{0}_{1}'.format(k,kk)
                fieldnames.append(name)
                newDict[name]=vv
                
        elif (type(v) is list):
            for item in range(len(v)):
                listItem=v.pop()
                if (type(listItem) is dict):
                    for kk,vv in listItem.items():
                        name='{0}_{1}'.format(k,kk)
                        fieldnames.append(name)
                        newDict[name]=vv
        
        else:
            print('k=[{0}] , v=[{1}]'.format(k,v))
            fieldnames.append(k)
            newDict[k]=v
    
    return fieldnames, newDict


# create fieldnames from the dictionary with lists and dictionaries
fieldnames, newDict=generateFieldnames(myDict)
pp.pprint(fieldnames)
print('\n')
pp.pprint(fieldnames)
print('\n\n')

# write a sample .csv with fieldnames as headers
fd = open('mytest.csv','a')
dw = csv.DictWriter( fd, fieldnames=fieldnames)

dw.writeheader() # write the header row

dw.writerow( newDict )
dw.writerow( newDict )
dw.writerow( newDict )

fd.close()

暂无
暂无

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

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