在CSV中单元格写入多个值
对于每个用户,我都有他们参与的事件列表。比如说,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 个回答
你似乎在说你的 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或其他地方查看它吗?如果不会,那么你可能只想用 pickle
或 json
来保存 evnt_list
对象,而根本不需要用到CSV。
编辑:我应该更仔细地阅读;evnt_list
的数据是被 追加 到CSV中的,而 pickle
和 json
都不容易追加。所以我想CSV是一个合理且轻量的方式来积累数据。虽然一个完整的数据库可能更好,但那样就不那么轻量了。
你需要把你的值格式化成一个字符串:
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
按预期工作。