wake-up-neo.com

Ein Wörterbuch in einer Datei (alternativ zu pickle) in Python speichern?

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")
48
wKavey

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"}'
60
David Wolever

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'}
53
Glenn Maynard

Das YAML-Format (über Pyyaml) könnte eine gute Option für Sie sein:

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

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

7
Pedro Matiello

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 ) )
7
gseattle

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.

3
serv-inc

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

0
Mike McKerns