2017-01-22 102 views
1

我被困在一個問題。 我的詞典列表看起來像這樣:Python寫一個詞典列表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 

你認爲是可能的解決呢?

+0

是的,繼續嘗試吧。然後,發佈你的嘗試,我們可以進一步幫助你。 –

+0

按內鍵(alpha,beta,...)分組是否需要,或者結果可以按任何順序? – xzoert

+0

每本詞典都有相同的長度嗎? CSV中的行的順序是否重要? – mikerose

回答

3

pandas提供了一種非常直觀的方式來思考迭代字典列表。因爲列表中的每個元素都可以很容易地轉換爲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 
+0

謝謝#benjamingross!它效果很好! – CosimoCD

+0

你打賭@CosimoCuriale,['pandas'](https://github.com/pandas-dev/pandas/blob/master/doc/cheatsheet/Pandas_Cheat_Sheet.pdf)是一個非常強大的模塊,如果你打算做'csv'寫作和數據操作,我強烈鼓勵進一步的探索。 – benjaminmgross

2

創建從文件對象DictWriter對象,並轉換爲類型的字典的迭代後使用作家對象的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'}] 
+0

至少在Python 3上:* TypeError:'str'不支持緩衝區接口* – Tagc

+0

我仍然收到相同的錯誤。你是在Python 2還是Python 3下運行? – Tagc

+0

'open(your_filename,'w')'(no _b_)。 – DyZ

2

(總是)使用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 
1

這是我一分錢,如果我可以用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