2011-02-04 7 views
44

Odpowiedział skończyło się dzieje z zalewy na końcu i takZapisywanie słownika do pliku (alternatywa dla pikle) w Pythonie?

Ok więc o kilka porad na pytanie innego ja zapytałem powiedziano mi używać marynatę zapisać do pliku słownika.

Słownik że starałem się zapisać do pliku był

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

Kiedy zalewa zapisać go do pliku ... to był format

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

Czy możesz dać mi alternatywny sposób, aby zapisać ciąg do pliku?

Jest to format, że chciałbym to zapisać w

członków = { 'Starspy': 'SHSN4N', 'test': 'Test1'}

kompletny kod:

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") 
+2

Co jest nie tak z formatem? Jak by ci się to podobało? –

+0

Chciałbym zapisać jako zwykły słownik. members = {'Starspy': 'SHSN4N', 'Test': 'Test1'} – wKavey

+1

Zobacz [Przechowywanie słowników Python] (http://stackoverflow.com/q/7100125/562769) –

Odpowiedz

58

Jasne, zapisać go jako plik CSV:

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

następnie odczyt byłoby:

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

Inną alternatywą byłoby json (json do wersji 2.6+ lub zainstalować simplejson dla 2,5 i poniżej):

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

Dzięki, czy nadal możesz zaimportować plik .csv akta? – wKavey

+0

Yup, zobacz moją edycję. –

+0

Oh wow to działa tak daleko, jak mogę powiedzieć. Dzięki za pakiet! – wKavey

52

Najpopularniejszym obecnie formatem serializacji jest JSON, który jest powszechnie obsługiwany i bardzo wyraźnie reprezentuje proste struktury danych, takie jak słowniki.

>>> 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'} 
+2

Złapię go. Jak określić plik do zrzutu do/załadować go? – wKavey

+9

Dump zwraca ciąg znaków. Możesz po prostu napisać to do dowolnego pliku zgodnie z normalnym pythonem IO 'with open ('file.json', 'w') jako f: f.write (json.dumps (członkowie))' –

+0

co to jest w jsonie ładowanie formatu? –

0

Chociaż sugeruję pickle, jeśli chcesz alternatywę, można użyć 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} 

Z klepto, jeśli użył serialized=True, słownik byłby napisany do memo.pkl jako marynowanych słowniku zamiast z tekstem.

Można uzyskać klepto tutaj: https://github.com/uqfoundation/klepto

dill jest chyba lepszym wyborem dla wytrawiania następnie pickle się, jak dill można szeregować prawie wszystko w Pythonie. klepto może również używać dill.

Można uzyskać dill tutaj: https://github.com/uqfoundation/dill

6

Chociaż, w odróżnieniu pp.pprint(the_dict), to nie będzie tak ładna, będą prowadzone wspólnie, str() przynajmniej sprawia słownikiem savable w prosty sposób do szybkich zadań:

f.write(str(the_dict)) 
+0

Od Pythona 3.2 ten zapisany obiekt tekstowy można zaimportować za pomocą ['ast.literal_eval'] (https://docs.python.org/3/library/ast.html#ast.literal_eval) – Chris

3

Ty asked

Ill dać mu szansę. Jak określić plik do zrzutu do/załadować go?

Oprócz pisania na sznurku, moduł json zapewnia dump() -method, który zapisuje do pliku:

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

Jest load() metoda do czytania, zbyt.