2014-02-26 51 views
1

我有一個csv文件,其中每行包含一個人的ID#,然後是一堆屬性。我希望能夠爲包含所有屬性的每個人創建一個元組,然後將元組命名爲ID#的一些變體。爲redis動態命名元組

所有這些元組將被添加到redis中的一個集合中進行存儲。

我似乎無法弄清楚如何創建以人員ID#命名的元組。

我知道它不是最好的實踐來動態命名變量,但我寧願不把所有的元組放在列表或設置爲然後放入一個redis集(這是必須的);它看起來效率低下和繁瑣。

這是我現在的代碼:

with open('personlist.csv','rb') as f: 
for line in f: 
     row = line.split(',') 
     personID = row[0] 
     attrb1 = row[1] 
     attrb2 = row[2] 
     attrb3 = row[3] 
     # Need to name tuple here and define as (attrb1, attrb2, attrb3) 
     r.lpush('allpersonslist',tuple) 
+0

可以展開在你的q題目了吧?你只是試圖在redis中創建一個包含所有人的集合? –

+0

爲什麼不使用'csv'模塊?它會阻止你在CSV文件中遇到各種語法問題。 – CivFan

回答

0

這個例子需要額外的代碼來運行。我假設你正在使用redis-py等redis API。變量r是一個到redis的開放連接。

import pickle 

with open('personlist.csv', 'rb') as f: 
    for line in f: 
     row = line.split(',') 
     personID = row[0] 
     attrb1 = row[1] 
     attrb2 = row[2] 
     attrb3 = row[3] 
     #put the attributes in a tuple 
     tuple = (attrb1, attrb2, attrb3) 
     #serialize the tuple before adding it to the set 
     r.set("person/%d" %personID,pickle.dumps(tuple,-1)) 

def getPerson(Id): 
    return pickle.loads(r.get("person/%d" %Id))  

您可以撥打getPerson(5)返回一個人ID 5

+0

是使用redis-py。理想情況下,我希望元組以namesID命名,所以如果我有三個ID:101,102和103,我希望元組名稱爲101_tuple,102_tuple和103_tuple。並將這些添加到redis集。這樣我可以稍後再回來,並通過ID號提取這些元組。 我對這一切都有點新鮮,所以我不太瞭解序列化。酸洗實現了我上面所描述的嗎? – StSh

+0

我根據您在此處提供的附加信息更新了示例。你不需要在redis中使用一個或一個列表,你可以設置/獲取密鑰。你必須使用'pickle',因爲你需要發送redis字符串。 –

0

的。如果每個人有最大n屬性相關的元組,有基於哈希獨立於語言的解決方案。這裏列出3個命令來保存/讀取/刪除一個人的值。

  1. HMSET 'allpersonshash' PERSONID:0 PERSONID:1 ......
  2. HMGET 'allpersonshash' PERSONID:0 PERSONID:1個PERSONID:2 ... PERSONID:N
  3. HDEL「allpersonshash 「PERSONID:0 PERSONID:1個PERSONID:2 ... PERSONID:N
0

一個相當普遍的方式做到這一點是使用有序集合使用JSON的斑點,如:

ZADD userid, '{field1:value1,field2:value2}'