1

对于每个用户,我都有他参与的活动列表。例如鲍勃:[event1,event2,...]

我想把它写在 csv 文件中。我创建了一个字典(键 - 用户和值 - 事件列表)我用 csv 写的。以下是示例输出

username, frnds
"abc"     ['event1','event2']

其中用户名是第一个 col 和 frnds 2n​​d col

这是代码

writer = csv.writer(open('eventlist.csv', 'ab'))
for key, value in evnt_list.items():
    writer.writerow([key, value])

当我阅读 csv 时,我没有直接得到列表。但我以下列方式得到它

['e','v','e','n','t','1','','...]

我也尝试直接在 csv 中编写列表,但在阅读时得到相同的输出。

我想要的是单个单元格中的多个值,这样当我读取一行的列时,我会得到所有事件的列表。

e.g
colA  colB
user1,event1,event2,...

我认为这并不难,但不知何故我没有得到它。

###阅读

我在以下帮助下阅读它

codereader = csv.reader(open("eventlist.csv")) 
reader.next() 
for row in reader: 
    tmp=row[1] 
    print tmp # it is printing the whole list but 
        print tmp[0] #the output is [ 
        print tmp[1] #output is 'e' it should have been 'event1'
        print tmp[2] #output is 'v' it should have been 'event2'
4

2 回答 2

2

您必须将值格式化为单个字符串:

with open('eventlist.csv', 'ab') as f:
    writer = csv.writer(f, delimiter=' ')
    for key, value in evnt_list.items():
        writer.writerow([key, ','.join(value)])

出口为

key1 val11,val12,val13
key2 val21,val22,val23

阅读:在这里您必须记住,您将 Python 列表转换为格式化字符串。因此,您不能使用标准的 csv 工具来阅读它:

with open("eventlist.csv") as f:
    csvr = csv.reader(f, delimiter=' ') 
    csvr.next() 
    for rec in csvr: 
        key, values_txt = rec 
        values = values_txt.split(',')
        print key, values

按预期工作。

于 2013-02-14T12:35:21.523 回答
0

您似乎在说您evnt_list是一个字典,其键是字符串,其值是字符串列表。如果是这样,那么您在问题中给出的 CSV 编写代码会将 Python 列表的字符串表示形式写入第二列。当您从 CSV 中读取任何内容时,它只是一个字符串,因此您将再次获得列表的字符串表示形式。例如,如果您有一个包含"['event1', 'event2']"您的单元格,您将读取一个字符串,该字符串的第一个字符(位置 0)是[,第二个字符是',第三个字符是e,等等。(我认为您的说法不tmp[1]正确;我认为是真的',不是e。)

听起来您想重建 Python 对象,在本例中是字符串列表。为此,请使用ast.literal_eval

import ast

cell_string_value = "['event1', 'event2']"
cell_object = ast.literal_eval(cell_string_value)

顺便说一句,使用ast.literal_eval而不是公正的原因eval是安全。eval允许任意 Python 表达式,因此存在安全风险。

另外,如果您想将列表作为列表返回,CSV 的目的是什么?人们会阅读它(用 Excel 或其他方式)吗?如果没有,那么您可能只想使用or保存evnt_list对象,而根本不用 CSV。picklejson

编辑:我应该更仔细地阅读;来自的数据evnt_list附加到 CSV 中,并且既不pickle也不json容易附加。所以我认为 CSV 是一种合理且轻量级的数据积累方式。一个成熟的数据库可能会更好,但这不会是轻量级的。

于 2013-02-14T15:11:53.007 回答