在csv中的单个单元格中写入多个值

时间:2013-02-14 12:32:35

标签: python csv

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

我想在csv文件中编写它。我创建了一个字典(key - user& value - 事件列表) 我在csv中写了它。以下是示例输出

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

其中,用户名是第一个col,第二个是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'

2 个答案:

答案 0 :(得分: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

正在等待。

答案 1 :(得分:0)

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

听起来你想要重建Python对象,在这种情况下是一个字符串列表。为此,请使用e

ast.literal_eval

顺便提一下,使用import ast cell_string_value = "['event1', 'event2']" cell_object = ast.literal_eval(cell_string_value) 而非ast.literal_eval的原因是安全性。 eval允许任意Python表达式,因此存在安全风险。

另外,如果您希望将列表作为列表返回,CSV的用途是什么?人们会阅读它(在Excel或其他东西)?如果没有,那么您可能只想使用evalevnt_list保存pickle对象,而根本不需要使用CSV。

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