繁体   English   中英

Python将字典列表写入CSV

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM