簡體   English   中英

將多頭csv轉換為python中的嵌套字典

[英]Convert multiheader csv to nested dictionary in python

我的 csv 文件的內容是::

[user@localhost ~]$ cat tempcsv.csv
info,info,auth,req,req
name,desc,username,key1,key2
a,alphabet,admin,1,team

在這里,csv 包含兩個標題。

在使用熊貓讀取 csv 時,

>>> import pandas as pd
>>> pd.read_csv('tempcsv.csv', sep=',', header=[0,1], encoding = "utf-8-sig", skipinitialspace=True, tupleize_cols=True)
  (info, name) (info, desc) (auth, username)  (req, key1) (req, key2)
0            a     alphabet            admin            1        team
>>> df = pd.read_csv('tempcsv.csv', sep=',', header=[0,1], encoding = "utf-8-sig", skipinitialspace=True, tupleize_cols=True)
>>> df.to_dict()
{(u'req', u'key1'): {0: 1}, (u'req', u'key2'): {0: u'team'}, (u'info', u'name'): {0: u'a'}, (u'auth', u'username'): {0: u'admin'}, (u'info', u'desc'): {0: u'alphabet'}}

現在在嘗試將數據幀轉換為 dict 時,我得到了一個以元組為鍵的列表 dicts。

>>> df.to_dict('records')
[{(u'req', u'key1'): 1, (u'req', u'key2'): u'team', (u'info', u'name'): u'a', (u'auth', u'username'): u'admin', (u'info', u'desc'): u'alphabet'}]

當我嘗試將它們轉換為合適的字典時,

>>> result = []
>>> row_data = {}
>>> for row in df.to_dict('records'):
...     for key,value in row.iteritems():
...             row_data.setdefault(key[0], {})[key[1]] = value
...
>>> row_data
{u'info': {u'name': u'a', u'desc': u'alphabet'}, u'req': {u'key2': u'team', u'key1': 1}, u'auth': {u'username': u'admin'}}

這就是我的預期輸出——

{u'info': {u'name': u'a', u'desc': u'alphabet'}, u'req': {u'key2': u'team', u'key1': 1}, u'auth': {u'username': u'admin'}}

所以我的問題是,有沒有辦法使用 python 將數據幀轉換為 dict?

或者,有沒有辦法使用 csv 包來做同樣的事情?

熊貓版:

>>> import pandas as pd
pd>>> pd.__version__
'0.14.1'

我不認為pandas能夠解析此類 CSV,但您始終可以使用內置的csv模塊並自己解析數據,例如:

import csv
import collections

with open("tempcsv.csv", "rb") as f: # on Python 3.x use: open("tempcsv.csv", "r", newline="")
    reader = csv.reader(f)  # create a CSV reader
    header = next(reader)  # collect the primary header
    subheader = next(reader)  # collect the subheader
    rows = []
    for row in reader:  # iterate over the rest of the CSV file
        parsed_row = collections.defaultdict(dict)  # use a dictionary factory
        for i, v in enumerate(header):  # iterate over the primary header fields
            # update each in the factory using the primary->secondary header map
            parsed_row[v].update({subheader[i]: row[i]})  
        rows.append(parsed_row)

這將創建一個rows列表,其中包含所有帶有融合標題的行。 對於您的數據,一行如下所示:

{'info': {'name': 'a', 'desc': 'alphabet'},
 'auth': {'username': 'admin'},
 'req': {'key1': '1', 'key2': 'team'}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM