[英]Python write a list of dictionaries to csv
我陷入了一個問題。 我有一個字典列表,看起來像這樣:
dict_list=[{'alfa':['001','2'], 'beta':['001','3'], 'gamma':['001','2']},
{'alfa':['002','6'], 'beta':['002','4'], 'omega':['002','7']}]
我的意圖是創建這樣的csv:
WORD, TEXT, FREQ
alfa, 001, 2
alfa, 002, 6
beta, 001, 3
beta, 002, 4
gamma,001, 2
omega,002, 7
您認為有可能解決嗎?
pandas
提供了一種非常直觀的方式來考慮迭代字典列表。 因為該列表中的每個元素是一個dict
,可以很容易地轉化成pandas.DataFrame
,你可以遍歷列表,創建一個DataFrame
的每一個元素,然后concat
他們。
In [20]: l = []
In [21]: for dct in dict_list:
...: l.append(
...: pandas.DataFrame(dct).transpose()
...: )
In [22]: tmp = pandas.concat(l) # aggregate them all
In [23]: print(tmp)
Out[23]:
0 1
alfa 001 2
beta 001 3
gamma 001 2
alfa 002 6
beta 002 4
omega 002 7
pandas
非常容易地寫入csv
,因此您可以執行以下操作:
In [21]: tmp.to_csv('/my-file-path.csv')
使用pandas
對象,您可以對它們進行各種排序(例如,所需的所需結果):
In [24]: tmp.sort_index()
Out[24]:
0 1
alfa 001 2
alfa 002 6
beta 001 3
beta 002 4
gamma 001 2
omega 002 7
以及更多! 要完全復制您要查找的內容,只需重命名Index
和列,如下所示:
In [30]: tmp.index.name = 'WORD'
In [36]: tmp = tmp.rename(columns={0: 'TEXT', 1: 'FREQ'})
In [37]: print(tmp)
TEXT FREQ
WORD
alfa 001 2
beta 001 3
gamma 001 2
alfa 002 6
beta 002 4
omega 002 7
從文件對象創建DictWriter
對象,並在轉換為可迭代的writerows
之后,使用writer對象的writerows
方法寫入文件:
import csv
with open(your_filename, 'w') as f:
fieldnames = ['WORD', 'TEXT', 'FREQ']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows([dict(zip(fieldnames, (k,v1,v2))) for d in dict_list
for k, [v1, v2] in d.items()])
如果在寫入文件之前打印迭代器,則將具有:
# [{'FREQ': '2', 'TEXT': '001', 'WORD': 'alfa'},
# {'FREQ': '2', 'TEXT': '001', 'WORD': 'gamma'},
# {'FREQ': '3', 'TEXT': '001', 'WORD': 'beta'},
# {'FREQ': '6', 'TEXT': '002', 'WORD': 'alfa'},
# {'FREQ': '7', 'TEXT': '002', 'WORD': 'omega'},
# {'FREQ': '4', 'TEXT': '002', 'WORD': 'beta'}]
(總是)使用pandas
:
import pandas as pd
df0 = pd.DataFrame(dict_list).stack().reset_index()
# level_0 level_1 0
#0 0 alfa [001, 2]
#1 0 beta [001, 3]
#2 0 gamma [001, 2]
#3 1 alfa [002, 6]
#4 1 beta [002, 4]
#5 1 omega [002, 7]
df0 = pd.concat([df0, df0[0].apply(pd.Series)], axis=1)
df0.columns = ('dummy','WORD','tuple','TEXT','FREQ')
df0[['WORD','TEXT','b']].sort_values('WORD').to_csv("your_file.csv",index=False)
#WORD,TEXT,FREQ
#alfa,001,2
#alfa,002,6
#beta,001,3
#beta,002,4
#gamma,001,2
#omega,002,7
如果可以使用pyexcel,這是我的一分錢:
>>> import pyexcel as p
>>> dict_list=[{'alfa':['001','2'], 'beta':['001','3'], 'gamma':['001','2']},
... {'alfa':['002','6'], 'beta':['002','4'], 'omega':['002','7']}]
>>> s = p.Sheet()
>>> for d in dict_list:
... s.row += p.get_sheet(adict=d, transpose_after=True)
>>> s.colnames = ['WORD', 'TXT', 'FREQ']
>>> s
pyexcel sheet:
+-------+-----+------+
| WORD | TXT | FREQ |
+=======+=====+======+
| alfa | 001 | 2 |
+-------+-----+------+
| beta | 001 | 3 |
+-------+-----+------+
| gamma | 001 | 2 |
+-------+-----+------+
| alfa | 002 | 6 |
+-------+-----+------+
| beta | 002 | 4 |
+-------+-----+------+
| omega | 002 | 7 |
+-------+-----+------+
>>> s.save_as('output.csv')
output.csv的內容如下:
WORD,TXT,FREQ
alfa,001,2
beta,001,3
gamma,001,2
alfa,002,6
beta,002,4
omega,002,7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.