如何将字典的值写入 CSV 文件

How to write the values of a dictionary into a CSV file

这是我的 Python 版本:

import sys

print(sys.version)

>> 3.6.9 (default, Nov  7 2019, 10:44:02) 
>> [GCC 8.3.0]

我 运行 在 Google Colaboratory 笔记本上。

我是 Python 的新手,我还没有找到任何有用的示例来说明如何将以下字典写入 CSV。

print(my_dict)

>> {'loss': [0.411, 0.115, 0.147, 0.078, 0.032], 'accuracy': [0.996, 0.997, 0.997, 0.997, 0.997], 'val_loss':  [0.147, 0.100, 0.187, 0.065, 0.052], 'val_accuracy': [0.99, 0.99, 0.99, 0.996, 0.996]}

并且:

print(type(my_dict))

>> <class 'dict'>

我想获取这个 CSV 文件:

loss,accuracy,val_loss,val_accuracy
0.411,0.996,0.147,0.99
0.115,0.997,0.100,0.99
0.147,0.997,0.187,0.99
0.078,0.997,0.065,0.996
0.032,0.997,0.052,0.996

每个键的值作为列。

我正在尝试使用这段代码(我正在使用标准输出来查看发生了什么):

import sys
import csv

w = csv.DictWriter(sys.stdout, my_dict.keys())
w.writeheader()
w.writerows(my_dict.values())

但我收到错误消息:

AttributeError: 'list' object has no attribute 'keys'

我把最后一行改成这样:

w.writerows(my_dict)

我得到同样的错误:

AttributeError: 'str' object has no attribute 'keys'

还有这个:

w.writerows(results.history.items())

出现错误:

AttributeError: 'tuple' object has no attribute 'keys'

另外,我试过了:

for key, value in my_dict.items():
  w.writerow([key,value])

出现错误:

AttributeError: 'list' object has no attribute 'keys'

另一个测试:

for data in my_dict:
  w.writerow(data)

出现错误:

AttributeError: 'str' object has no attribute 'keys'

我该怎么做?

import csv

my_dict = {'loss': [0.411, 0.115, 0.147, 0.078, 0.032], 'accuracy': [0.996, 0.997, 0.997, 0.997, 0.997], 'val_loss':  [0.147, 0.100, 0.187, 0.065, 0.052], 'val_accuracy': [0.99, 0.99, 0.99, 0.996, 0.996]}

with open("test.csv", "w") as outfile:
  writer = csv.writer(outfile)
  writer.writerow(my_dict.keys())
  writer.writerows(zip(*my_dict.values()))

输出:

loss,accuracy,val_loss,val_accuracy
0.411,0.996,0.147,0.99
0.115,0.997,0.1,0.99
0.147,0.997,0.187,0.99
0.078,0.997,0.065,0.996
0.032,0.997,0.052,0.996

如果您需要对字典进行排序:

keys = sorted(my_dict.keys())
with open("test.csv", "w") as outfile:
   writer = csv.writer(outfile, delimiter = ",")
   writer.writerow(keys)
   writer.writerows(zip(*[my_dict[key] for key in keys]))

排序输出:

accuracy,loss,val_accuracy,val_loss
0.996,0.411,0.99,0.147
0.997,0.115,0.99,0.1
0.997,0.147,0.99,0.187
0.997,0.078,0.996,0.065
0.997,0.032,0.996,0.052

更多关于 zip

你得到所有这些 AttributeError 异常的原因是你没有正确使用 writerow()DictWriter 版本。该版本的 writerow 将字典作为参数,其中字典的键是行字段的名称,字典的值是行字段的值。这意味着您的 CSV 文件的第 i 行(不包括 header)应该这样写:

w.writerow({'loss': my_dict['loss'][i],
            'accuracy': my_dict['accuracy'][i],
            'val_loss': my_dict['val_loss'][i],
            'val_accuracy': my_dict['val_accuracy'][i]})

由于这有点笨拙,Harshal Parekh 编写 CSV 文件的方法更好,尽管他的第一种方法确实依赖 Python 以某种方式对字典条目进行排序。 (旧版本的 Python 需要 my_dict 类型为 OrderedDict 才能使第一种方法起作用。)