[英]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.