guardar - Guarde un diccionario en un archivo(alternativa a pickle) en Python?
python pickle ejemplos (6)
Respondí terminé yendo con pickle al final de todos modos
Ok, entonces, con algunos consejos sobre otra pregunta, pregunté si me dijeron que usara pickle para guardar un diccionario en un archivo.
El diccionario que estaba intentando guardar en el archivo era
members = {''Starspy'' : ''SHSN4N'', ''Test'' : ''Test1''}
Cuando Pickle lo guardó en el archivo ... este era el formato
(dp0
S''Test''
p1
S''Test1''
p2
sS''Test2''
p3
S''Test2''
p4
sS''Starspy''
p5
S''SHSN4N''
p6
s.
¿Puedes darme una forma alternativa de guardar la cadena en el archivo?
Este es el formato que me gustaría guardar en
members = {''Starspy'': ''SHSN4N'', ''Test'': ''Test1''}
Código completo:
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")
Aunque, a diferencia de pp.pprint(the_dict)
, esto no será tan bonito, se ejecutará en conjunto, str()
al menos hace que un diccionario sea salvable de una manera sencilla para tareas rápidas:
f.write( str( the_dict ) )
Claro, guárdalo como CSV:
import csv
w = csv.writer(open("output.csv", "w"))
for key, val in dict.items():
w.writerow([key, val])
Entonces leerlo sería:
import csv
dict = {}
for key, val in csv.reader(open("input.csv")):
dict[key] = val
Otra alternativa sería json ( json
para la versión 2.6+, o install simplejson
para 2.5 y siguientes):
>>> import json
>>> dict = {"hello": "world"}
>>> json.dumps(dict)
''{"hello": "world"}''
El formato YAML (a través de pyyaml) podría ser una buena opción para ti:
El formato de serialización más común para esto hoy en día es JSON, que es universalmente compatible y representa estructuras de datos simples como diccionarios muy claramente.
>>> 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''}
Si bien sugiero pickle
, si quieres una alternativa, puedes usar 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}
Con klepto
, si hubiera utilizado serialized=True
, el diccionario se habría escrito en memo.pkl
como un diccionario escabechado en lugar de con texto claro.
Puede obtener klepto
aquí: https://github.com/uqfoundation/klepto
dill
es probablemente una mejor opción para conservar en vinagre luego pickle
, ya que el dill
puede serializar casi cualquier cosa en pitón. klepto
también puede usar dill
.
Puedes obtener dill
aquí: https://github.com/uqfoundation/dill
Tu asked
Lo intentaré. ¿Cómo especifico de qué archivo descargarlo / cargarlo?
Además de escribir en una cadena, el módulo json
proporciona un método dump()
-method, que escribe en un archivo:
>>> a = {''hello'': ''world''}
>>> import json
>>> json.dump(a, file(''filename.txt'', ''w''))
>>> b = json.load(file(''filename.txt''))
>>> b
{u''hello'': u''world''}
También hay un método load()
para leer.