Как записать значения словаря в файл CSV - PullRequest
1 голос
/ 27 февраля 2020

Это моя Python версия:

import sys

print(sys.version)

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

И я работаю на ноутбуке Google Colab Laboratory.

Я новичок ie с 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 file :

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' нет атрибута '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])

с ошибкой:

при tributeError: у объекта 'list' нет атрибута 'keys'

Еще один тест:

for data in my_dict:
  w.writerow(data)

С ошибкой:

AttributeError: 'str 'У объекта нет атрибута' ключи '

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020
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

Подробнее о застежка-молния .

1 голос
/ 27 февраля 2020

Причина, по которой вы получаете все эти AttributeError исключения, заключается в том, что вы неправильно используете DictWriter версию writerow(). Эта версия writerow принимает словарь в качестве аргумента, где ключи словаря - это имена полей строк, а значения словаря - значения полей строк. Это означает, что строка i вашего CSV-файла (не считая заголовка) должна быть записана примерно так:

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]})

Поскольку это довольно неуклюжий подход Харшала Пареха к написанию CSV-файла лучше, хотя его первый подход основывается на Python упорядочении записей словаря определенным образом. (Старые версии Python должны иметь my_dict типа OrderedDict для первого подхода к работе.)

...