在Python中保存一个字典到一个文件(替代pickle)?

无论如何,我终于和腌菜结束了

好,所以在我问另外一个问题时,我被告知使用pickle将字典保存到一个文件。

我试图保存到文件的字典是

members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'} 

当腌菜保存到文件…这是格式

 (dp0 S'Test' p1 S'Test1' p2 sS'Test2' p3 S'Test2' p4 sS'Starspy' p5 S'SHSN4N' p6 s. 

你能给我一个替代方法来保存string的文件?

这是我希望保存的格式

members = {'Starspy':'SHSN4N','Test':'Test1'}

完整代码:

 import sys import shutil import os import pickle tmp = os.path.isfile("members-tmp.pkl") if tmp == True: os.remove("members-tmp.pkl") shutil.copyfile("members.pkl", "members-tmp.pkl") pkl_file = open('members-tmp.pkl', 'rb') members = pickle.load(pkl_file) pkl_file.close() def show_menu(): os.system("clear") print "\n","*" * 12, "MENU", "*" * 12 print "1. List members" print "2. Add member" print "3. Delete member" print "99. Save" print "0. Abort" print "*" * 28, "\n" return input("Please make a selection: ") def show_members(members): os.system("clear") print "\nNames", " ", "Code" for keys in members.keys(): print keys, " - ", members[keys] def add_member(members): os.system("clear") name = raw_input("Please enter name: ") code = raw_input("Please enter code: ") members[name] = code output = open('members-tmp.pkl', 'wb') pickle.dump(members, output) output.close() return members #with open("foo.txt", "a") as f: # f.write("new line\n") running = 1 while running: selection = show_menu() if selection == 1: show_members(members) print "\n> " ,raw_input("Press enter to continue") elif selection == 2: members == add_member(members) print members print "\n> " ,raw_input("Press enter to continue") elif selection == 99: os.system("clear") shutil.copyfile("members-tmp.pkl", "members.pkl") print "Save Completed" print "\n> " ,raw_input("Press enter to continue") elif selection == 0: os.remove("members-tmp.pkl") sys.exit("Program Aborted") else: os.system("clear") print "That is not a valid option!" print "\n> " ,raw_input("Press enter to continue") 

当然,保存为CSV:

 import csv w = csv.writer(open("output.csv", "w")) for key, val in dict.items(): w.writerow([key, val]) 

然后阅读它将是:

 import csv dict = {} for key, val in csv.reader(open("input.csv")): dict[key] = val 

另一种select是json( json for 2.6+,或者安装simplejson for 2.5及以下版本):

 >>> import json >>> dict = {"hello": "world"} >>> json.dumps(dict) '{"hello": "world"}' 

目前最常见的序列化格式是JSON,它得到了广泛的支持,并且非常清楚地表示了简单的字典数据结构。

 >>> members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'} >>> json.dumps(members) '{"Test": "Test1", "Starspy": "SHSN4N"}' >>> json.loads(json.dumps(members)) {u'Test': u'Test1', u'Starspy': u'SHSN4N'} 

YAML格式(通过pyyaml)可能是一个很好的select:

http://en.wikipedia.org/wiki/Yaml

http://pypi.python.org/pypi/PyYAML

虽然不像pp.pprint(the_dict) ,它不会像漂亮一样可以一起运行,但str()至less可以让一个字典以一种简单的方式保存,以便执行快速任务:

 f.write( str( the_dict ) ) 

你问

我给它一个镜头。 如何指定将其转储到/从中加载的文件?

除了写入string之外, json模块还提供了一个dump()方法,该方法写入一个文件:

 >>> a = {'hello': 'world'} >>> import json >>> json.dump(a, file('filename.txt', 'w')) >>> b = json.load(file('filename.txt')) >>> b {u'hello': u'world'} 

还有一个load()方法可供阅读。

虽然我会build议pickle ,如果你想要一个替代品,你可以使用klepto

 >>> init = {'y': 2, 'x': 1, 'z': 3} >>> import klepto >>> cache = klepto.archives.file_archive('memo', init, serialized=False) >>> cache {'y': 2, 'x': 1, 'z': 3} >>> >>> # dump dictionary to the file 'memo.py' >>> cache.dump() >>> >>> # import from 'memo.py' >>> from memo import memo >>> print memo {'y': 2, 'x': 1, 'z': 3} 

使用klepto ,如果您使用了serialized=True ,则字典将被作为pickle字典而不是以明文forms写入到memo.pkl中。

你可以在这里获得klepto : https : //github.com/uqfoundation/klepto

dill可能是一个更好的select,然后pickle自己,因为dill可以序列几乎任何东西在python。 klepto也可以使用dill

你可以在这里得到dill : https : //github.com/uqfoundation/dill