48 votes

Enregistrer un dictionnaire dans un fichier (alternative à pickle) en Python ?

Réponse : J'ai fini par choisir le cornichon à la fin de toute façon.

Ok donc avec quelques conseils sur une autre question que j'ai posée, on m'a dit d'utiliser pickle pour sauvegarder un dictionnaire dans un fichier.

Le dictionnaire que j'essayais de sauvegarder dans le fichier était

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

Quand Pickle l'a enregistré dans le fichier... c'était le format suivant

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

Pouvez-vous me donner une autre façon d'enregistrer la chaîne de caractères dans le fichier ?

Voici le format dans lequel je voudrais qu'il soit enregistré

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

Code complet :

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

60voto

David Wolever Points 34304

Bien sûr, enregistrez-le en CSV :

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

Alors la lecture serait :

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

Une autre alternative serait json ( json pour la version 2.6+, ou installer simplejson pour 2.5 et moins) :

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

53voto

Glenn Maynard Points 24451

Le format de sérialisation le plus courant à l'heure actuelle est JSON, qui est universellement pris en charge et représente très clairement les structures de données simples comme les dictionnaires.

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

7voto

Pedro Matiello Points 61

Le format YAML (via pyyaml) pourrait être une bonne option pour vous :

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

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

7voto

gseattle Points 178

Bien que, contrairement à pp.pprint(the_dict) ce ne sera pas aussi joli, mais il faudra courir ensemble, str() permet au moins de sauvegarder un dictionnaire d'une manière simple pour les tâches rapides :

f.write( str( the_dict ) )

0voto

Mike McKerns Points 965

Bien que je suggère pickle si vous voulez une alternative, vous pouvez utiliser 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}

Avec klepto si vous aviez utilisé serialized=True le dictionnaire aurait été écrit pour memo.pkl comme un dictionnaire décapé plutôt qu'en texte clair.

Vous pouvez obtenir klepto ici : https://github.com/uqfoundation/klepto

dill est probablement un meilleur choix pour le décapage que pickle lui-même, comme dill peut sérialiser presque n'importe quoi en python. klepto peut également utiliser dill .

Vous pouvez obtenir dill ici : https://github.com/uqfoundation/dill

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X