对于每个用户,我都有他参与的活动列表。 例如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'
答案 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或其他东西)?如果没有,那么您可能只想使用eval
或evnt_list
保存pickle
对象,而根本不需要使用CSV。
编辑:我应该仔细阅读;来自json
的数据附加到CSV,evnt_list
和pickle
都不容易追加。所以我认为CSV是一种合理且轻量级的数据累积方式。一个完整的数据库可能会更好,但这不会那么轻量级。