beantwortet Am Ende bin ich sowieso mit Gurke gelandet
Okay, mit ein paar Ratschlägen zu einer anderen Frage wurde mir gesagt, ich solle ein Wörterbuch mit pickle in einer Datei speichern.
Das Wörterbuch, das ich in der Datei speichern wollte, war
members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
Als pickle es in der Datei gespeichert hat ... war dies das Format
(dp0
S'Test'
p1
S'Test1'
p2
sS'Test2'
p3
S'Test2'
p4
sS'Starspy'
p5
S'SHSN4N'
p6
s.
Können Sie mir bitte eine alternative Möglichkeit geben, den String in der Datei zu speichern?
Dies ist das Format, in dem ich es speichern möchte
members = {'Starspy': 'SHSN4N', 'Test': 'Test1'}
Vollständiger Code:
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")
Sicher, speichern Sie es als CSV:
import csv
w = csv.writer(open("output.csv", "w"))
for key, val in dict.items():
w.writerow([key, val])
Dann wäre es zu lesen:
import csv
dict = {}
for key, val in csv.reader(open("input.csv")):
dict[key] = val
Eine andere Alternative wäre json (json
für Version 2.6+ oder installiere simplejson
für 2.5 und niedriger):
>>> import json
>>> dict = {"hello": "world"}
>>> json.dumps(dict)
'{"hello": "world"}'
Das gebräuchlichste Serialisierungsformat hierfür ist heutzutage JSON, das universell unterstützt wird und einfache Datenstrukturen wie Wörterbücher sehr übersichtlich darstellt.
>>> 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'}
Das YAML-Format (über Pyyaml) könnte eine gute Option für Sie sein:
Obwohl dies im Gegensatz zu pp.pprint(the_dict)
nicht so hübsch ist, sondern zusammen ausgeführt wird, macht str()
zumindest ein Wörterbuch auf einfache Weise für schnelle Aufgaben speicherbar:
f.write( str( the_dict ) )
Sie gefragt
Ich versuche es mal. Wie gebe ich an, aus welcher Datei sie kopiert/geladen werden soll?
Abgesehen vom Schreiben in einen String bietet das Modul json
eine dump()
- Methode, die in eine Datei schreibt:
>>> a = {'hello': 'world'}
>>> import json
>>> json.dump(a, file('filename.txt', 'w'))
>>> b = json.load(file('filename.txt'))
>>> b
{u'hello': u'world'}
Es gibt auch eine load()
-Methode zum Lesen.
Während ich pickle
vorschlagen würde, können Sie klepto
verwenden, wenn Sie eine Alternative wünschen.
>>> 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}
Mit klepto
, wenn Sie serialized=True
, das Wörterbuch wäre geschrieben worden nach memo.pkl
als eingelegtes Wörterbuch statt mit Klartext.
Sie können klepto
hier abrufen: https://github.com/uqfoundation/klepto
dill
ist wahrscheinlich die bessere Wahl zum Beizen als pickle
selbst, da dill
fast alles in Python serialisieren kann. klepto
kann auch dill
verwenden.
Sie können dill
hier abrufen: https://github.com/uqfoundation/dill