从字典字符串制作字典

时间:2015-04-06 19:26:38

标签: python dictionary

我从一个文件创建了一个字典,需要将其写入另一个我要编辑的文件中。为此,我从第一个文件创建了一个字典,并将其转换为字符串,将其写入第二个文件。有没有办法将此字符串转换回字典?

第一个文件的示例是:

123 2
125 5
128 3

我将其制作成字典并在第二个文件中生成一个字符串:

def CreateNew(prefix, old_file):
    new_file = open('new_file_name', 'w')
    new_file.write(str(old_file))
    new_file.close()
    return new_file

现在,我需要对这个新文件中的一些值进行编辑,但我不确定如何将这个字典字符串重新放回字典中。我想打印出来测试一下:

def EmpTrans(transactions_file, new_file):
    print(dict(new_file))

但这给了我一个空字典{} 我试图不使用任何模块。我能够使用eval()。

3 个答案:

答案 0 :(得分:1)

将字典打印到文件:

output_file = open(path_to_stored_dictionary, 'w')
output_file.write(str(my_dictionary))
output_file.close()

从文件中读取字典:

my_dictionary = open(path_to_stored_dictionary, 'r').read()
my_dictionary = eval(my_dictionary)

注意@TigerhawkT3的评论:

  

... eval()执行代码,如果不信任的来源将字符串发送到此函数,这可能会很危险。

答案 1 :(得分:0)

要将字符串转换回字典,您可以将字符串拆分为键值对的元组。为此,您可以拆分它。

def get_dict(s):
    return dict(map(lambda kv: kv.split(" "), s.split("\n")))

但我会建议不要这样做。在这种情况下,您应该使用Pickle模块,除非您绝对不信任数据。另见:How can I use pickle to save a dict?

import pickle

def dump(dict_, file):
    with open(file + ".pickle", "wb") as handle:
        pickle.dump(dict_, handle)

def load(file):
    with open(file + ".pickle", "rb") as handle:
        return pickle.load(handle)

dict_可以是任何对象。

答案 2 :(得分:0)

另一个安全功能是使用JSON。在这里,我使用json.dump()json.load()函数。唯一的障碍是,json load将字符串作为unicode字符串返回,因此我使用自己的JSONDecoder类调用super,然后遍历结果以对字符串进行编码:

import json
from types import *

# your own decoder class to convert unicode to string type
class MyJSONDecoder(json.JSONDecoder):

    # decode using our recursive function
    def decode(self,json_string):
        return self._decode_obj(super(MyJSONDecoder,self).decode(json_string))

    # recursive function to traverse lists
    def _decode_list(self,data): 
        decoded = []
        for item in data:
            if type(item) is UnicodeType:   item = item.encode('utf-8')
            elif type(item) is ListType:    item = self._decode_list(item)
            elif type(item) is DictType:    item = self._decode_obj(item)
            decoded.append(item)
        return decoded

    # recursive function to traverse objects
    def _decode_obj(self,data): 
        decoded = {}
        for key, value in data.iteritems():
            if type(key) is UnicodeType:    key = key.encode('utf-8')
            if type(value) is UnicodeType:  value = value.encode('utf-8')
            elif type(value) is ListType:   value = self._decode_list(value)
            elif type(value) is DictType:   value = self._decode_obj(value)
            decoded[key] = value
        return decoded

# the dictionary to save
dict = {
    "123": 2,
    "125": 4,
    "126": 5,
    "128": 6
}

# decoder instance
my_decoder = MyJSONDecoder()

# write object to file
with open('serialized.txt', 'w') as new_file:
    json.dump(dict, new_file)
    new_file.close()
    print "Original", dict

# read object from file
with open ("serialized.txt", "r") as old_file:
    dictcopy = my_decoder.decode(old_file.read())
    old_file.close()
    print "**Copy**", dictcopy