2

简单的问题:我可以将列表存储在 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 文件并使其可用?

4

3 回答 3

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改用,这不是保存数据的好方法。

于 2012-09-29T06:13:38.647 回答
2

一般来说,CSV 不能很好地处理列表。可以将数据取出,但您必须自己解析列表的字符串表示形式。一种替代方法是使用支持列表数据的格式,例如 JSON。

将您的列表从 CSV 中取出的快速而肮脏但不安全eval的方法是使用您返回的字符串。如果你有 string "['5', '0']",那么 eval-ing 它会给你返回列表:

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

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

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

于 2012-09-29T06:08:12.923 回答
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())
于 2012-09-29T08:37:50.613 回答