我从一个文件创建了一个字典,需要将其写入另一个我要编辑的文件中。为此,我从第一个文件创建了一个字典,并将其转换为字符串,将其写入第二个文件。有没有办法将此字符串转换回字典?
第一个文件的示例是:
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()。
答案 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