Запись в csv словаря с объектом datetime.datetime в качестве ключей - PullRequest
0 голосов
/ 09 марта 2020

У меня есть словарь, который содержит datetime.datetime объектов в качестве ключей, и я хотел бы записать их в CSV-файл. Тем не менее, ошибка ниже генерируется:

Traceback (most recent call last):
  File "/Users/macbook/Documents/08_PYTHON/00_PROJECTS/Navps/code/scrape.py", line 179, in <module>
    writer.writerow(data)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/csv.py", line 154, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/csv.py", line 147, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'datetime.datetime' object has no attribute 'keys'

Вот мой код ниже:

csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for data in csvdict:
            writer.writerow(data)
except IOError:
    print("I/O error")

Вот как выглядит csvdict:

csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010', datetime.datetime(2019, 2, 8, 0, 0): '2.8295', datetime.datetime(2019, 2, 7, 0, 0): '2.8326',....}

Что-то мне не хватает при обработке datetime.datetime объектов как ключей? Я действительно хочу, чтобы в качестве ключей были даты. Возможно ли это вообще?

Примечание. Если это поможет, я запусту этот скрипт на Python 3.8

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

Вы, кажется, неправильно понимаете, как работает DictWriter; пример говорит, что вы напишите полный текст, например,

writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

, и у вас есть один большой словарь значений ключей. Было бы лучше использовать простой csv.Writer:

csv_columns = ['Date','Fund Value']
with open(bof, 'w') as csvfile:
    writer = csv.Writer(csvfile)
    writer.writerow(csv_columns)
    for date, value in csvdict.items():
        writer.writerow([date.isoformat(), value])

Я выбрал ISO-8601 в качестве формата даты для вас, , потому что это единственно правильная вещь ; -.) 1013 *

1 голос
/ 09 марта 2020

Проблема в том, что csv.DictWriter хочет, чтобы каждая строка была словарем. Таким образом, чтобы использовать его, вам необходимо преобразовать пары ключевых значений в csvdict в строки. Это просто благодаря встроенной функции zip():

import csv
import datetime


bof = 'bof.csv'
csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010',
           datetime.datetime(2019, 2, 8, 0, 0): '2.8295',
           datetime.datetime(2019, 2, 7, 0, 0): '2.8326',}

csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w', newline='') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for row in (dict(zip(csv_columns, item)) for item in csvdict.items()):
            writer.writerow(row)
except IOError:
    print("I/O error")
1 голос
/ 09 марта 2020

DictWriter для написания списка словарей:

, которые содержат точно такие же ключи ,

Вы можете использовать обычный csv-writer:

import datetime
import csv

bof = "somefile.csv"
csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010', 
           datetime.datetime(2019, 2, 8, 0, 0): '2.8295',
           datetime.datetime(2019, 2, 7, 0, 0): '2.8326'}
csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(csv_columns)
        for key, value in csvdict.items():
            writer.writerow([key, value])
except IOError:
    print("I/O error") 

Вывод:

Date,Fund Value
2019-01-16 00:00:00,2.8010
2019-02-08 00:00:00,2.8295
2019-02-07 00:00:00,2.8326
...