在python中存储和检索csv文件中的列表

时间:2012-09-29 06:01:41

标签: python list csv

简单问题:我可以将列表存储在CSV文件中吗?如果是这样,我该如何检索它?

这是我写入文件的文件内容,我现在正试图检索它。

40;['5', '0'];['15', '0'] ; ['25', '0'] ; ['30', '0'] ; ['40', '0'] ; ['50', '0'].....   
50; ['0', '0'] ; ['10', '0'] ; ['15', '0'] ; ['25', '0'] ; ['30', '0'] ; ['40', '0'].....
60; ['0', '0'] ; ['10', '0'] ; ['15', '0'] ; ['20', '0'] ; ['25', '0'] ; ['30', '0'].....
70; ['0', '0'] ; ['5', '0'] ; ['10', '0'] ; ['15', '0'] ; ['20', '0'] ; ['30', '0'].....

这是我尝试检索它的一些代码:

import csv
reader = csv.reader(open("NewTableInfo", "r"), delimiter=';')
for row in reader:
    print (row)

这会产生一个列表,其中括号中的值是字符串类型。我希望它们成为列表(在另一个文件中,我将每一行都作为字典项)。

['40', "['5', '0']", "['15', '0'] ", " ['25', '0'] ", " ['30', '0'] "......

有什么想法吗?是否可以按照我上面的方式编写CSV文件,并让它们可用?

3 个答案:

答案 0 :(得分:3)

做你所说的话是可能的:

import csv
import ast

with open("NewTableInfo", "r") as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        print [ast.literal_eval(x.strip()) for x in row]

但我建议使用pickle代替,这不是保存数据的好方法。

答案 1 :(得分:2)

通常,CSV不能很好地处理列表。可以将数据输出,但是您必须自己解析列表的字符串表示。 alernative是使用支持列表数据的格式,如JSON。

从CSV中获取列表的快速而又不安全方法是对您获得的字符串使用eval。如果你有字符串"['5', '0']",那么评估它会给你回复列表:

>>> eval("['5', '0']")
['5', '0']

但是,正如我所说,这是不安全的,所以你应该只在处理你自己创建的CSV文件时使用它,所以你知道它们只包含数字列表等。不要评估你无法控制的字符串;人们可以制作恶意字符串,当评估时,删除硬盘上的文件或做其他邪恶的事情。

如果出于安全考虑而无法使用eval,则必须自行解析列表格式。这可能是一项相当繁重的任务。如果您需要这样做,您可能最好为数据选择不同的格式,例如JSON。

答案 2 :(得分:0)

你也可以使用json。 csv是否有原因?

import json

# write
out = open("datafile.json", "w")
data = [['5', '0'],['15', '0'] ,['25', '0'] ,['30', '0'] ,['40', '0'], ['50', '0']]
json_out_data = json.dumps(data)
out.write(json_out_data)
out.close()

input = open("datafile.json", "r")
data = json.loads(input.read())