2013-02-14 94 views
1

对于每个用户,我都有他参与的事件列表。 例如bob:[event1,event2,...]在单个单元格中写入多个值csv

我想写在csv文件中。我创建了一个字典(关键 - 用户&值 - 事件列表) 我写在csv中。以下是样本输出

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

其中用户名是第一关口和frnds我第二山坳

这是代码

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' 

回答

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 

作为期待。

+0

我编辑了我的问题。阅读csv时可以找到我的问题。 – Jack 2013-02-14 12:56:38

+0

感谢您的示例代码。我根据自己的需要修改了它,并解决了我的问题。 – Jack 2013-02-14 15:28:43

+0

您实际上仍然可以使用'csv'模块来处理多值单元格:'values = csv.reader([values_txt])。next()'。这在'values_txt'太复杂以至于'split'无法自行处理的情况下会很有用。 (我意识到这里提出的问题不属于这些情况之一。) – 2013-02-14 17:04:30

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或其他)?如果没有,那么你可能想要简单地使用picklejson保存evnt_list对象,并且根本不用打扰CSV。

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

+0

我正在研究推荐系统。目前,我正在创建报废数据。接下来,我将对这些数据应用各种算法来查找模式。 – Jack 2013-02-14 15:59:54

相关问题