2013-02-14 105 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

相關問題