【问题标题】:How to write the values of a dictionary into a CSV file如何将字典的值写入 CSV 文件
【发布时间】:2020-06-11 19:55:27
【问题描述】:

这是我的 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

每个键的值作为列。

我正在尝试使用此代码(我正在使用 stdout 来查看它发生了什么):

import sys
import csv

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

但我得到了错误:

AttributeError: 'list' 对象没有属性 'keys'

我用这个改变了最后一行:

w.writerows(my_dict)

我得到了同样的错误:

AttributeError: 'str' 对象没有属性 'keys'

还有这个:

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

出现错误:

AttributeError: 'tuple' 对象没有属性 'keys'

而且,我也试过了:

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

出现错误:

AttributeError: 'list' 对象没有属性 'keys'

另一个测试:

for data in my_dict:
  w.writerow(data)

出现错误:

AttributeError: 'str' 对象没有属性 'keys'

我该怎么做?

【问题讨论】:

  • 你能举例说明 CSV 应该是什么样子吗?
  • @HarshalParekh 我已经用 CSV 文件格式更新了我的问题。

标签: python csv export-to-csv


【解决方案1】:
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

【讨论】:

  • “如果您不关心订单”是什么意思?谢谢。
  • 我以为my_dict.keys() 会重新排序,但事实并非如此。以防万一您需要对输出进行排序,我将添加另一个 sn-p。
  • 非常感谢您的帮助。
【解决方案2】:

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

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 才能使用第一种方法。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2023-03-03
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多