使用Python将字典写入CSV文件,其中键作为列标题

3
我将尝试将字典中的元素写入文本文件,其中每个键都将成为一列。目前,我有一个看起来像这样的东西:
import csv
import numpy as np



data1 = np.arange(10)
data2 = np.arange(10)*2
data3 = np.arange(10)*3

writefile = '../Desktop/data.txt'
datadict = {} 

datadict['data1'] = data1
datadict['data2'] = data2
datadict['data3'] = data3


f = open( writefile, 'w' )
fieldnames = ['data1','data2', 'data3']
data = csv.DictWriter(writefile, fieldnames, restval='', extrasaction='ignore', dialect='excel')

f.close()

但是它给我报错“argument 1 must have a "write" method”。我不确定这是什么意思。我也担心方言='excel',但我不知道还能放什么。最终我想要一个类似下图的文件:
谢谢
5个回答

8

这里根本不需要使用DictWriter:

import csv
import numpy as np

data1 = np.arange(10)
data2 = np.arange(10)*2
data3 = np.arange(10)*3

writefile = '../test.csv'
fieldnames = ['data1','data2', 'data3']
with open( writefile, 'w' ) as f:
    writer = csv.writer(f)
    writer.writerow(fieldnames)
    writer.writerows(zip(data1, data2, data3))

2
你应该将类文件对象作为第一个参数传递给 DictWriter 构造函数。
datalist = [{'data1': d1, 'data2': d2, 'data3': d3} for d1, d2, d3 in zip(data1, data2, data3)]
...
f = open(writefile, 'w')
...
writer = csv.DictWriter(f, ...) 
for i in xrange(10):
    writer.writerow(datalist[i])
f.close()

更简单的类比案例:

with open(writefile, 'w') as f:
    writer = csv.writer(f)
    for row in zip(data1, data2, data3):
        writer.writerow(row)

这会给我一个错误,因为文件还不存在。当我放一个空文件时,它会返回空文件。 - Alexa Halford
(已修复,请重试)我忘记了'w'修改符,你应该关闭文件或刷新它。 - defuz
我已经尝试过了,但最终仍然得到了一个空文件。 - Alexa Halford
我们忘记使用 writer.writerow (http://docs.python.org/library/csv.html#csv.writer)。这应该可以解决问题。 - defuz
我会在晚餐后尝试那个循环,但那看起来很有前途。谢谢。 - Alexa Halford
with语句是错误的,应该是 with open(writefile, 'w') as f: - Michael

1

如果您正在进行类似于这里所展示的数据分析工作,最好的选择可能是使用Python专用的数据分析库pandas

以下是一个实现您要求的示例:

import pandas as pd
import numpy as np

data1 = np.arange(10)
data2 = np.arange(10)*2
data3 = np.arange(10)*3

df = pd.DataFrame(zip(data1, data2, data3), columns=['data1', 'data2', 'data3'])
df.to_csv('myfile.csv')

很不错,我会说。此外,您现在可以使用所有 种类难以想象的 方法处理您的数据。
您还可以从现有字典中创建一个DataFrame
In [115]: a_dict = {'foo':[1,2,3], 'bar':[4,5,6], 'baz':[7,8,9]}

In [116]: pd.DataFrame(a_dict)
Out[116]: 
   bar  baz  foo
0    4    7    1
1    5    8    2
2    6    9    3

0

试试这个:

import csv
import numpy as np

data1 = np.arange(10)
data2 = np.arange(10)*2
data3 = np.arange(10)*3

writefile = '../Desktop/data.txt'
datadictlist = [{'data1': data1[i], 'data2': data2[i], 'data3': data3[i]} for i in xrange(10)]

f = open( writefile, 'w' )
fieldnames = ['data1','data2', 'data3']
writer = csv.DictWriter(f, fieldnames, restval='', extrasaction='ignore', dialect='excel')
writer.writerows(datadictlist)

f.close()

这只是给我一个空文件,里面没有任何数据写入。 - Alexa Halford
现在它正在打印数据(耶),但格式不正确。它给我一行,其中包含[0 1 2 3 4 5 6 7 8 9],[0 2 4 6 8 10 12 14 16 18],[0 3 6 9 12 15 18 21 24 27]。 - Alexa Halford
@AlexaHalford,这是因为你将整个数组分配给一个字典中的单个字段。我更新了代码以打印你想要展示的输出。 - Abhinav Sarkar

0

使用'a+'代替'w'

f = open( writefile, 'a+' )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接