Python - 使用eval()将CSV放入字典中

时间:2015-05-02 09:15:54

标签: python csv dictionary eval

嘿,我想知道你是否可以帮助我,我做了一些关于使用eval()读取我的CSV行然后把它放入字典的研究。问题是我的CSV有4个数据:名称,第一个分数,第二个分数和第三个分数。如何将这些数据从CSV传输到python中的字典中,以便稍后我可以检查该用户名是否是要附加到其上的字典或编辑分数。

我想拥有密钥这个名称,分数是列表,并保存在列表中,以便以后可以附加/删除。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

Python标准库中有一个模块可以帮助您阅读/编写CSV files。我假设您的csv文件如下所示:

Jim, 45, 78, 90
Mary, 100,98, 99
Molly, 78, 45,46
Mat, 76, 89, 95

然后:

import csv                                                                                                                                   
scores = {}                                                                                                                                         
with open('score.csv') as f:                                                                                                                 
    reader = csv.reader(f)                                                                                                                   
    for row in reader:                                                                                                                                                                                                                                                    
       scores.setdefault(row[0],[]).extend(row[1:])  

这将创建一个字典scores,其名称为键,分数列表为值:

{'Mat': [' 76', ' 89', ' 95'], 'Jim': [' 45', ' 78', ' 90'], 'Molly': [' 78', ' 45', '46'], 'Mary': [' 100', '98', ' 99']}

答案 1 :(得分:2)

import csv
from collections import defaultdict

# Your target is a dictionary {name : [scores]}
scores = defaultdict(list)
with open(csvfilename) as csvfile:
    for row in csv.reader(csvfile):
        scores[row[0]].extend(row[1:])

我认为eval不是一个很好的工具。使用它引入安全漏洞非常容易,因为它将解析并执行您传递的任何内容。作为练习,请考虑为什么从某些csv文件执行数据可能不合适。 Spoiler:你的csv文件是序列化格式,这个讲话Tom Eastman - Serialization formats are not toys - PyCon 2015显示了那里可能存在的危险。有关奖励见解,请查看我们从中导入defaultdict的收集模块的来源,并考虑@ raymond-hettinger为什么this use of exec与使用数据上的eval不同。

答案 2 :(得分:0)

eval()不是你想要的,我不会想到。 eval()读取一个字符串并将其解释为python代码;你想要的是简单的文件I / O操作。

data = numpy.genfromtxt("filename.csv", delimter=";")  # non-numpy possibilities available
my_dict = {}
for i in data:
    my_dict[data[i,0]] = data[i,1:]

答案 3 :(得分:0)

如果你真的,真的想用csv来做:首先,你不应该,除非你有充分的理由。只需将文件解析为CSV,而不是Python代码。正确的方法是使用tuple模块,如Chris Wesseling's answer(或者,如果您已经在使用NumPy或Pandas,则使用其功能)。

但如果你真的,真的,真的想要,可以吗?

好吧,有时候。

最基本的CSV方言不引用字符串,因此它的行不会像Python代码那样有效。并且一些CSV方言处理嵌入式引号的方式要么在Python中无效,要么意味着不同。

但是,有些方言确实使得至少大多数行合法且有意义,因为Python str文字由Python intfloateval文字组成。对于那些方言,从技术上讲,是的,你可以用scores = {} with open(path) as f: for line in f: name, *newscores = eval(line) scores.setdefault(name, []).extend(newscores) 解析它们,如下所示:

eval

但是,你不应该。

即使你真的,真的,真的想要这样做,你至少应该使用literal_eval;它将处理__import__('os').system('rm -rf /')所有相同的法律价值,而不会打开大的安全漏洞(例如,有人将literal_eval放入CSV中)和痛苦的调试边缘情况。

但即使使用collision,您也不需要它。你想要解析你所拥有的实际CSV方言,而不仅仅是将它视为一种相似但又不同的语言并交叉。