将 csv 文件复制到 dict

时间:2021-01-23 10:38:17

标签: python csv

我正在尝试将数据从 csv 文件复制到 dict 列表,但在执行指向行 pb_data[counter]["episode"].append(episodes) 时收到“列表索引超出范围”错误消​​息.我用打印检查了变量,计数器是否正确设置为 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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

在您的代码中,pb_data 是一个包含一个字典的列表,因此当 counter 大于零(列表中第一个元素的索引)时,您会得到一个 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'}]

用于打开的 encoding='utf-8-sig' 关键字参数对文件进行解码,使其不以“”开头,这是一个字节顺序标记,表示该文件是使用 Microsoft 版本的 UTF-8 文本编码的编码。

相关问题