web-dev-qa-db-fra.com

Enregistrer un dictionnaire dans un fichier (alternative au cornichon) en Python?

Répond J'ai fini par aller avec des cornichons à 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 des cornichons pour enregistrer un dictionnaire dans un fichier.

Le dictionnaire que j'essayais d'enregistrer dans le fichier était

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

Lorsque cornichon l'a enregistré dans le fichier ... c'était le format

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

Pouvez-vous s'il vous plaît me donner un autre moyen d'enregistrer la chaîne dans le fichier?

C'est le format dans lequel j'aimerais qu'il enregistre

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

Bien sûr, enregistrez-le au format CSV:

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

La lecture serait alors:

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 installez simplejson pour 2.5 et ci-dessous):

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

Le format de sérialisation le plus courant de nos jours 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'}
53
Glenn Maynard

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

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

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

7
Pedro Matiello

Bien que, contrairement à pp.pprint(the_dict), ce ne sera pas aussi joli, sera exécuté ensemble, str() rend au moins un dictionnaire enregistrable de manière simple pour des tâches rapides:

f.write( str( the_dict ) )
7
gseattle

Vous demandé

Je vais essayer. Comment spécifier à partir de quel fichier le vider/le charger?

Outre l'écriture dans une chaîne, le module json fournit une méthode dump() -, qui écrit dans un fichier:

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

Il existe également une méthode load() pour la lecture.

3
serv-inc

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 dans memo.pkl comme un dictionnaire mariné au lieu d'un texte clair.

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

dill est probablement un meilleur choix pour le décapage puis pickle lui-même, car dill peut sérialiser presque tout en python. klepto peut également utiliser dill.

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

0
Mike McKerns