首页 > 解决方案 > 将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

我错过了什么?

标签: pythoncsv

解决方案


在您的代码中,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 文本编码版本进行编码。


推荐阅读