簡體   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