如何在Python中正确读取写入CSV的字典?解决读取报错
解决从CSV文件读取字典的两个问题
我来帮你搞定这两个问题,先逐个拆解原因,再给你靠谱的解决代码:
第一个错误:IndexError: list index out of range
原因分析
你用csv.reader的时候,它默认按逗号分割每行内容,但你的dict.csv里每行是用空格分隔键和列表字符串,而且列表内部也有空格。这就导致csv.reader把整行当成一个单独的元素,rows列表里只有rows[0],自然取不到rows[1],就抛出了索引越界的错误。
修复代码
我们可以手动分割每行,只分割一次(把键和后面的列表字符串分开),再用ast.literal_eval把字符串形式的列表转成真正的Python列表(比eval更安全,不会执行恶意代码):
import csv import ast my_dict = {} with open('dict.csv', 'r') as csv_file: for line in csv_file: # 去掉换行符,只分割一次,避免拆分列表内部的空格 key, value_str = line.strip().split(maxsplit=1) # 把字符串转成列表 my_dict[key] = ast.literal_eval(value_str) print(my_dict)
第二个错误:UnicodeDecodeError
原因分析
pd.read_csv默认用utf-8编码读取文件,但你的文件可能是用其他编码保存的(比如Windows系统常见的gbk、cp1252编码),所以解码时就会报错。
修复代码
你需要指定正确的编码,同时处理好每行的分割逻辑:
import pandas as pd import ast my_dict = {} # 先尝试不同编码(比如gbk、cp1252),直到不报错 df = pd.read_csv('dict.csv', sep=' ', header=None, maxsplit=1, encoding='gbk') for _, row in df.iterrows(): key = row[0] value_str = row[1] my_dict[key] = ast.literal_eval(value_str) print(my_dict)
额外建议:优化写入CSV的方式
其实你之前的写入方式有点不规范,导致读取时容易出问题。建议写入时把列表转成字符串,用逗号分隔键和值,这样读取会更顺畅:
import csv # 示例字典 my_dict = { 'accord': [16, 32, 49], 'according': [8, 37, 49, 50], 'accordingly': [8, 37, 50], 'account': [8, 10, 16, 19, 20, 23, 25, 33, 34, 47] } with open('dict.csv', 'w', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) for key, value in my_dict.items(): # 把列表转成字符串后写入 writer.writerow([key, str(value)])
这样写入的CSV每行格式是accord,"[16, 32, 49]"(csv.writer会自动给带空格的字符串加引号),读取时用csv.reader就能直接拿到键和值字符串,再转成列表即可:
import csv import ast my_dict = {} with open('dict.csv', 'r', encoding='utf-8') as csv_file: reader = csv.reader(csv_file) for row in reader: key = row[0] value_str = row[1] my_dict[key] = ast.literal_eval(value_str)
内容的提问来源于stack exchange,提问作者Hassaan Saleem
相关产品推荐
相关产品推荐

