从python中的字典元素列表创建一个csv文件

时间:2014-01-22 22:22:54

标签: python csv dictionary

所以我有一个里面有6个dicts的列表,我想把它写到csv文件中。  我已经尝试了很多方法来做到这一点,但到目前为止我还没有成功。当我尝试将其作为列表编写时,当我尝试将其写为字典时,它会给我一个错误,它也会给我一个错误。任何人都可以指出我的写作方向。

     r_vals=
     [{'distance':2.35, 'mpg': 3.215, 'power': 45.0},{'distance':214.3, 'mpg':   29.3,'power': 124.0},{'distance':2.35, 'mpg': 3.215, 'power': 45.0},...{'distance':0.35, 'mpg': 45.5, 'power': 156.0}]

或者如果有更简单的方法将其作为数据帧,我希望它看起来像这样

    distance   mpg       power
    2.35       3.215     45.0
    214.3      29.3      124.0
    .
    . 
    0.35       45.5      156
谢谢你!

5 个答案:

答案 0 :(得分:5)

你看过熊猫了吗? http://pandas.pydata.org/

在熊猫中你可以这样做:

>>> r_vals
[{'distance': 2.35, 'power': 45.0, 'mpg': 3.215}, {'distance': 214.3, 'power': 124.0, 'mpg': 29.3}, {'distance': 2.35, 'power': 45.0, 'mpg': 3.215}, {'distance': 0.35, 'power': 156.0,'mpg': 45.5}]
>>> df = pandas.DataFrame(r_vals)
>>> df
   distance     mpg  power
0      2.35   3.215     45
1    214.30  29.300    124
2      2.35   3.215     45
3      0.35  45.500    156

然后你可以做:

df.to_csv("path.csv",index=False)

并且您已将字典保存在内存中的数据框和csv中。

如果你想只使用原生python,那么你可以这样做:

import csv
outfile = open("path.csv","w")
csv_writer = csv.write(outfile)
csv_writer.writerow(header)
header = r_vals[0].keys()
for row in r_vals:
  csv_writer.writerow(str([row[col_name]) for col_name in header])
outfile.close()

答案 1 :(得分:3)

“在python中使用字典元素创建一个csv文件”正是csv.DictWriter所做的:

with open('output.csv', 'w') as f:
    csv.DictWriter(f, fieldnames=rvals[0].keys()).writerows(rvals)

(如果您的最终目标是获取某种数据框对象,而您只是创建一个CSV文件,因为您认为这是最好的方式...那么您不必;请参阅Ryan G的答案pandas如何轻松实现这一目标。)

之后:

$ cat output.csv
3.215,45.0,2.35
29.3,124.0,214.3
3.215,45.0,2.35
45.5,156.0,0.35

当然,您可能希望它包含标题和/或按特定顺序放置列,而不是dict恰好具有的顺序。 (你不需要两个,但是如果你不做其中任何一个,那么CSV不是很有用,因为你不知道哪个列意味着什么...... )这两个:

with open('output.csv', 'w') as f:
    w = csv.DictWriter(f, fieldnames='distance mpg power'.split())
    w.writeheader()
    w.writerows(rvals)

输出:

distance,mpg,power
2.35,3.215,45.0
214.3,29.3,124.0
2.35,3.215,45.0
0.35,45.5,156.0

如果您想要默认CSV方言的变体,请参阅Dialects and Formatting Parameters。要准确获得所需的输出,只需将, delimiter='\t'添加到DictWriter构造函数。

答案 2 :(得分:0)

使用制表

r_vals=[[2.35,3.215,45.0],[214.3,29.3,124.0],[2.35, 3.215,45.0],[0.35,45.5,156.0]]

 print tabulate.tabulate(r_vals, headers=["distance","mpg", "power"])

  distance     mpg    power
----------  ------  -------
      2.35   3.215       45
    214.3   29.3        124
      2.35   3.215       45
      0.35  45.5        156

答案 3 :(得分:0)

您可以使用字符串格式化来执行您想要的操作:

with open(target, 'w') as f:
    f.write("distance\tmpg\tpower\n") # header
    for d in r_vals:
        f.write"{0[distance]:.2f}\t{0[mpg]:.3f}\t{0[power]:.1f}\n".format(d))

格式规范为格式规范0,格式为[key].nf选择适当的值,然后n给出{{1}}小数位。

答案 4 :(得分:0)

http://docs.python.org/2/library/csv.html#csv.DictWriter应该这样做,它还会根据您提供的列顺序编写标题行。

with open('/home/dnfehren/windesk/test.csv','wb') as fl:
    fc = csv.DictWriter(fl, ['distance','mpg','power'])

    for rvalnum, rval in enumerate(rvals):
        if rvalnum == 0:
            fc.writeheader()
            fc.writerow(rval)
        else:
            fc.writerow(rval)