python - 将csv文件复制到dict列表时列表索引超出范围
问题描述
我正在尝试将数据从 csv 文件复制到 dict 列表,但在执行指向行 pb_data[counter]["episode"].append(episodes) 时收到“列表索引超出范围”错误消息。我用 print 和 counter 检查了变量是否正确设置为 0。
这是我的代码:
import csv
from datetime import datetime
pb_data = [
{
"episode": [],
"title": [],
"pubdate": []
}
]
with open("downloads_stats.csv", "r") as f:
counter = csv.reader(f, delimiter = "\n")
data = list(counter)
episodes = len(data) - 1
with open("downloads_stats.csv", "r") as f:
reader = csv.DictReader(f)
counter = 0
for row in reader:
pb_data[counter]["episode"].append(episodes)
pb_data[counter]["title"].append(row["Episode"])
pb_data[counter]["pubdate"].append(datetime.strptime(row['Release Date'], '%Y-%m-%d').strftime("%d-%m-%Y"))
episodes -= 1
counter += 1
我错过了什么?
解决方案
在您的代码中,pb_data
是一个包含一个字典的列表,因此IndexError
当计数器大于零(列表中第一个元素的索引)时,您会得到一个。
相反,您需要从一个空列表开始,并为 csv 中的每一行附加一个新字典,如下所示:
import csv
import datetime as dt
# Example csv data
data = """\
Episode,Release Date
Ep1,2021-01-01
Ep2,2021-01-08
Ep3,2021-01-15
"""
pb_data = []
with open("downloads_stats.csv", "r", encoding='utf-8-sig') as f:
reader = csv.reader(f)
# Skip headers
next(reader)
rows = list(reader)
episodes = len(rows)
for episode, date in rows:
data = {}
episodes -= 1
data['episode'] = episodes
data['title'] = episode
data['pubdate'] = dt.datetime.strptime(date, '%Y-%m-%d').strftime('%d-%m-%Y')
pb_data.append(data)
print(pb_data)
输出
[{'episode': 2, 'title': 'Ep1', 'pubdate': '01-01-2021'}, {'episode': 1, 'title': 'Ep2', 'pubdate': '08-01-2021'}, {'episode': 0, 'title': 'Ep3', 'pubdate': '15-01-2021'}]
open的encoding='utf-8-sig'
关键字参数对文件进行解码,使其不以“”开头,这是一个字节顺序标记,表示文件使用 Microsoft 的 UTF-8 文本编码版本进行编码。
推荐阅读
- java - 使用 Firebase 存储文件夹中的图像填充数组
- javascript - nodejs 需要具有功能的文件仅在一个地方不起作用
- docker - 来自守护程序的错误响应:获取 https://xxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/v2/xxxx/manifests/v_50:没有基本身份验证凭据
- javascript - 子 div 的随机定位有时会溢出父 div。我该如何阻止/防止这种情况?
- c# - 在 Ubuntu 16.04 上使用 Rider 的 C# 项目中的“项目未找到”和“对象引用未设置为对象的实例”
- google-app-engine - google java flex 内存不足问题,响应为 502 Bad Gateway
- javascript - 在谷歌表格中的一行之前插入一行
- python - 在彼得森子图中找到一条哈密顿路径
- python - 使用另一个数组作为索引从 4D numpy 数组中读取元素
- vba - 仅当 Range 不完全为空白时,Excel VBA 到 SUMIF Range