将 datetime.datetime 对象作为键写入 csv 字典
Writing to csv a dictionary with datetime.datetime object as keys
我有一个字典,其中包含 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
上的这个脚本
DictWriter 用于编写字典列表:
包含完全相同的键。
您可以使用普通的 csv 编写器:
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
您似乎误解了 DictWriter
的工作原理; example 说你会写完整的字典,例如
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 作为日期格式,because it's the only right thing to do ;-)。
问题是 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")
我有一个字典,其中包含 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
上的这个脚本DictWriter 用于编写字典列表:
包含完全相同的键。
您可以使用普通的 csv 编写器:
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
您似乎误解了 DictWriter
的工作原理; example 说你会写完整的字典,例如
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 作为日期格式,because it's the only right thing to do ;-)。
问题是 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")