在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:
虽然不像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