2014-10-20 51 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函数,该函数尽可能安全地执行此操作。