2014-10-20 55 views
1

我用一個元組作爲關鍵字製作了一本字典。字典應該是這樣之後我加載它:擺脫自動報價CSV文件

dictionary = {("key1", "key2"): "value"} 

的問題是,當我把它保存到一個CSV文件,它增加了不必要的報價,所以它看起來是這樣的:

dictionary = {"("key1", "key2")": "value"} 

我的代碼,保存和加載文件看起來像這樣:

def Save(self): 
    w=csv.writer(open("file.csv", "w")) 
    for key, val in self.dictionary.items(): 
     w.writerow([key, val]) 
def Load(self): 
    self.dictionary={} 
    for key, val in csv.reader(open("file.csv")): 
     self.dictionary[key] = val 
     print self.dictionary.keys() 

任何人都知道如何做到這一點?提前致謝。

+0

請發佈可產生輸出的runnable代碼,您說您正在獲取。你發佈了兩種方法,但沒有周圍的類和數據,它們就沒用了。另外,它看起來像是重新輸入了輸出......'''和'「'之間的區別在CSV文件中非常重要。 – 2014-10-20 22:25:25

回答

0

我猜到了什麼樣的類可能有這些方法,並在file.csv產生這樣的輸出:

"('key1', 'key2')",value 

這看起來好像沒什麼問題。

請記住,您的元組中的逗號在CSV文件中具有不同的含義:它是字段分隔符。 csv.writer必須轉義或引用該逗號,否則CSV文件將包含三個列,而不是您期望的兩個列。典型的轉義方法是將單元格的內容包裹在引號中。

最後,CSV文件從不存儲對象,它們存儲字符串(技術上字節,其中open轉換爲字符串)。遍歷csv.reader會爲CSV文件中的每一行返回一個字符串的元組,而不是元組或列表,甚至整數。

要將該字符串轉換回其他某種數據類型,您必須將其傳遞給函數,如intfloat(如果您碰巧知道它應該是整數或浮點數)或評估字符串。這是一個非常危險的事情,所以不要嘗試自己評估字符串,並不相信內置的eval函數爲你做。 使用ast.literal_eval函數,該函數儘可能安全地執行此操作。