在CSV中单元格写入多个值

1 投票
2 回答
9319 浏览
提问于 2025-04-17 15:52

对于每个用户,我都有他们参与的事件列表。比如说,bob参与了[event1, event2, ...]这些事件。

我想把这些信息写入一个csv文件。我创建了一个字典,字典的键是用户,值是他们参与的事件列表。然后我把这些写入了csv文件。下面是一个示例输出:

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

在这里,用户名是第一列,朋友是第二列。

这是我写的代码:

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

你似乎在说你的 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是一个合理且轻量的方式来积累数据。虽然一个完整的数据库可能更好,但那样就不那么轻量了。

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

按预期工作。

撰写回答