Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将csv文件复制到dict列表时,列表索引超出范围_Python_Csv - Fatal编程技术网

Python 将csv文件复制到dict列表时,列表索引超出范围

Python 将csv文件复制到dict列表时,列表索引超出范围,python,csv,Python,Csv,我试图将csv文件中的数据复制到dict列表中,但在执行指向行pb_data[counter][“插曲”]的命令时,收到“列表索引超出范围”错误消息。追加(插曲)。我用print检查变量,计数器正确设置为0 这是我的密码: import csv from datetime import datetime pb_data = [ { "episode": [], "title": [], "

我试图将csv文件中的数据复制到dict列表中,但在执行指向行pb_data[counter][“插曲”]的命令时,收到“列表索引超出范围”错误消息。追加(插曲)。我用print检查变量,计数器正确设置为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
是一个包含一个字典的列表,因此当计数器大于零(列表中第一个元素的索引)时,您会得到一个
索引器

相反,您需要从一个空列表开始,并为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)
输出

[{'Spidence':2,'标题':'Ep1','pubdate':'01-01-2021'},{'Spidence':1,'标题':'Ep2','pubdate':'08-01-2021'},{'Spidence':0,'标题':'Ep3','pubdate':'15-01-2021'}]

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

如果要将读取的csv转换为dict列表,可以通过pandas DataFrame.to_dict函数进行转换。这是一个两行代码..:data=pd.read\u csv(文件路径);非常感谢,我今天学到了一些新东西!