Python: Serialización de Objetos

Al proceso de transformar el estado de un objeto en un formato que se pueda almacenar, recuperar y transportar se le conoce con el nombre de serialización o marshalling.
En Python tenemos varios módulos que nos facilitan esta tarea, como marshal, pickle, cPickle y shelve.
El módulo marshal es el más básico y el más primitivo de los tres, y es que, de hecho, su propósito principal y su razón de ser no es el de serializar objetos, sino trabajar con bytecode Python (archivos .pyc).
marshal sólo permite serializar objetos simples (la mayoría de los tipos incluidos por defecto en Python), y no proporciona ningún tipo de mecanismo de seguridad ni comprobaciones frente a datos corruptos o mal formateados. Es más, el formato utilizado para guardar el bytecode (y por tanto el formato utilizado para guardar los objetos con marshal) puede cambiar entre versiones, por lo que no es adecuado para almacenar datos de larga duración.
pickle, por su parte, permite serializar casi cualquier objeto (objetos de tipos definidos por el usuario, colecciones que contienen colecciones, etc) y cuenta con algunos mecanismos de seguridad básicos. Sin embargo, al ser más complejo que marshal, y, sobre todo, al estar escrito en Python en lugar de en C, como marshal, también es mucho más lento.
La solución, si la velocidad de la serialización es importante para nuestra aplicación, es utilizar cPickle, que no es más que es una implementación en C de pickle. cPickle es hasta 1000 veces más rápido que pickle, y prácticamente igual de rápido que marshal.
Si intentamos importar cPickle y se produce un error por algún motivo, se lanzará una excepción de tipo ImportError. Para utilizar cPickle si está disponible y pickle en caso contrario, podríamos usar un código similar al siguiente:
try:
import cPickle as pickleexcept
ImportError: import pickle
as en un import sirve para importar el elemento seleccionado utilizando otro nombre indicado, en lugar de su nombre.
La forma más sencilla de serializar un objeto usando pickle es mediante una llamada a la función dump pasando como argumento el nombre del objeto a serializar y un objeto archivo en el que guardarlo (o cualquier otro tipo de objeto similar a un archivo, siempre que ofrezca métodos read, realine y write).
try:
import cPickle as pickleexcept
ImportError:
import pick
lefichero = file("datos.dat", "w")
animales = ["piton", "mono", "camello"]
pickle.dump(animales, fichero)
fichero.close()
La función dump también tiene un parámetro opcional protocol que indica el protocolo a utilizar al guardar. Por defecto su valor es 0, que utiliza formato texto y es el menos eficiente. El protocolo 1 es más eficiente que el 0, pero menos que el 2. Tanto el protocolo 1 como el 2 utilizan un formato binario para guardar los datos.
try:
import cPickle as pickle
except ImportError:
import picklefichero = file("datos.dat", "w")
animales = ["piton", "mono", "camello"]
pickle.dump(animales, fichero, 2)
fichero.close()
Para volver a cargar un objeto serializado se utiliza la función load, a la que se le pasa el archivo en el que se guardó.
try:
import cPickle as pickle
except ImportError:
import picklefichero = file("datos.dat", "w")
animales = ["piton", "mono", "camello"]
pickle.dump(animales, fichero)
fichero.close()fichero = file("datos.dat")
animales2 = pickle.load(fichero)
print animales2
Supongamos ahora que queremos almacenar un par de listas en un fichero. Esto sería tan sencillo como llamar una vez a dump por cada lista, y llamar después una vez a load por cada lista.
fichero = file("datos.dat", "w")
animales = ["piton", "mono", "camello"]
lenguajes = ["python", "mono", "perl"]
pickle.dump(animales, fichero)
pickle.dump(lenguajes, fichero)
fichero = file("datos.dat")
animales2 = pickle.load(fichero)
lenguajes2 = pickle.load(fichero)
print animales2print lenguajes2
Pero, ¿y si hubiéramos guardado 30 objetos y quisiéramos acceder al último de ellos? ¿o si no recordáramos en qué posición lo habíamos guardado? El módulo shelve extiende pickle / cPickle para proporcionar una forma de realizar la serialización más clara y sencilla, en la que podemos acceder a la versión serializada de un objeto mediante una cadena asociada, a través de una estructura parecida a un diccionario.
La única función que necesitamos conocer del módulo shelve es open, que cuenta con un parámetro filename mediante el que indicar la ruta a un archivo en el que guardar los objetos (en realidad se puede crear más de un archivo, con nombres basados en filename, pero esto es transparente al usuario).
La función open también cuenta con un parámetro opcional protocol, con el que especificar el protocolo que queremos que utilice pickle por debajo.
Como resultado de la llamada a open obtenemos un objeto Shelf, con el que podemos trabajar como si de un diccionario normal se tratase (a excepción de que las claves sólo pueden ser cadenas) para almacenar y recuperar nuestros objetos.
Como un diccionaro cualquiera la clase Shelf cuenta con métodos get, has_key, items, keys, values, …
Una vez hemos terminado de trabajar con el objeto Shelf, lo cerramos usando el método close.
import shelve
animales = ["piton", "mono", "camello"]
lenguajes = ["python", "mono", "perl"]
shelf = shelve.open("datos.dat")
shelf["primera"] = animales
shelf["segunda"] = lenguajesprint
shelf["segunda"]shelf.close()
Particularmente, utilizo mucho este módulo de pickle cuando tengo que trasladar objetos desde un servidor de producción a un servidor de desarrollo y viceversa, lo cual resulta muy útil.

efWLSFUJWjpZzNJdW
comment4, drugs, drugs, drugstore, pharmacy,
bNfhwkMTypeXx
comment5, pills, drug, online drugstore, drugs, online drugstore, drug,
AERmgyzPZLVScwQ
comment4, ticket to work, oceanfront vacation rental maine, disney world season ticket, hotels in washington state, hotel jobs in boston, coos bay vacation rental, rod stewart concert tickets, normafa hotel, business first class airfares,
BVIWVLhdgVWtkOMrB
comment2, top 5 vacation spots, bosnia hotel, tampa bay hotel, ic tickets, airline power adapter cord, holiday inn columbia mo, california beach vacations, kavos hotel ekati, poland nascar tickets, luxury italy vacation,
FlMdSyVwhI
comment4, nuclear power plant disasters, seller second mortgage, mccs iwakuni, requirement elicitation, michael leonard,
safhMPWRGoO
comment3, reneson hotel group, bahia hotels, galena illinois hotel, guadeloupe vacation rental, adam mark hotel dallas, skywest flight attendant,
CYXhIJIgeDtEgcFqsog
comment3, travel, travel, hotels, airlines, airfare, airlines,
vJqWNJkBxJWdMhE
comment4, travel, tickets, airlines, travel, hotels, airline tickets,
XyJUuVfwObwuEHQOdQO
comment1, this, hosting, this, this, link, table, link, recipe, site, watching,
NSgEbhDvXtglbp
comment4, link, link, site, watching, link, watching, table, table, site, link, hosting,
HBQOkTrupYEjUP
comment4, recipe, this, this, this, hosting, link, links,
daHJCWiFQjs
comment3, links, table, sites, this, link, hosting, link, links,
HWIAZJLZLtYWl
comment1,
VOHerLsQohiDv
comment3, online drugstore, pharmacy, pharmacy, pharmacy, health, pharmacy, drugs, cheap pills, drugs, pills,
xVRDqGpMLybIaKVbQfH
comment2, web pharmacy, web pharmacy, pharmacy, drugs, cheap pharmacy, drugstore,
NhHdbyMQXDTqocqNV
comment3, online drugstore, drugstore, online pharmacy, cheap pharmacy, web pharmacy,
QrcUExnuaQCkuegJI
comment1, cheap pills, online pharmacy, cheap pills, health, online drugstore,
VLWUDLrhojpGZZG
comment1, health, health, drugs, pharmacy, health, pill,
iuTAEVlhbk
comment3, health, drugstore, online pharmacy, pharmacy, pharmacy, pharmacy, drugs, pills, online pharmacy,
QzPGeNbusMdr
comment2, lortab, carisoprodol, amaryl, lamictal weight, sumatriptan,
iLYoImDLheePmOx
comment1, zetia, lovastatin, salmeterol, lamictal alcohol,
qRIxVszEzvVaNy
comment3, diethylpropion, protonix drug interaction, aldactone, generic flexeril, prilosec patent, miralax, diazepam,
DGxWCJEuVlNpF
comment3, clomid date ovulation, naprosyn, paxil pharmacy purchase, meclizine, lexapro,
vhgPSqMdNojKwgzNTSD
comment3, history of roman art, world's longest labia, sexy sims 2, techno vinyl,
jnFgksMpkRXUv
comment2, distortion pedals, special ops gear, high school attendance policy, quality homebuilding specifications, portable easel, ad-aware 6, palm beach mall, gas space heater,
flJClqyXPapo
comment5, futuristic world, kenny chesney bald, just go ahead now, fax laser machine printer, sleeping dragons, blank book report form, blank book report form,
jVAIFtFPlVNfGgYHLX
comment1, project finance international magazine, south florida events, lemuel shattuck, analyst notebook,
XICCrcVqIeqMkjr
comment2, surgery large breast models, south park ike, military medical, extrusive igneous rock, motorcycle head porting, eva gardner, medical device packaging machinery,
GRKDrNSqTzW
comment1, professional internet marketing, tankless water heater canada, grow long hair faster, proteger captage eau, chaise lounge chair sofa, tv anime on dvd, black lesbian foot fetish,
jNPqNRLxnOpWG
comment2, restore data search, switch mode power supply, infomercial skin care, school logo, loan store,
IxnyEeqDur
comment4, suburban lawn and garden, suny esf, career guidance uk, canine bronchitis, anime icon, mr cranky,
xFlrSEcGMtOKrhnrz
comment2, cosmo town, anime halloween wallpaper, naked blonde teen, bentley luggage, scottish soccer, stockinette stitch,
tOnDDYdiCMwwvTo
comment5, transurethral microwave therapy, hot weman, car nos, rosie edeh, choke out, real estate in tahoe, big brother saskia,
xjguCtPCTAGqLn
comment4, cleocin, acetaminophen codeine, premarin, sumatriptan, soma without a prescription, aspirin chemical name, meridia and lower back pain, codeine withdrawals,
wTTAgmxqYLXhctvk
comment6, indiana meridia enforcement, soma muscle relaxant manufacturer, singulair allergy medication, oxycodone addiction withdrawal symptoms, digoxin, fioricet, thyroxine difference levothyroxine,
zekAHllkZZ
Hi | norco hydrocodone | online ordering xanax | drug information soma | singulair | ditropan | zoloft drug | abusing meridia |
KwwQfHOIJROdRxaT
Hello | diovan | topamax overdose | propecia | medicine soma | valium | side effects of adipex p | prozac | adipex |
xHwZvMvmgyGKisPRh
Hello | zanaflex tizanidine | kariva | viagra over the counter | clarinex | enzymes lipitor liver | ingredient in viagra | missouri meridia legal |
HHgcPukfGsqBD
Hi | naproxen warnings | buy soma | furosemide | meridia and wellbutrin | vicodin canada | drug tramadol price list | apo prednisone side effects |
jMueHbqAadf
Hello | clenbuterol hollywood | meridia | fioricet | hydrocodone |
fcqzlqUzWYTDWWAy
Hello | nortriptyline drug interactions | d dizziness zyrtec | online prescription fioricet with codeine | erythromycin and septra |
NNjDCqGjceMyGLQjl
Hello | sleep ais ambien and lunesta | lipitor | buying ultram | xanax dosage | nabumetone | zoloft |
CzwIIoYvwvoOiKK
Hi | detrol | online pharmacy soma | fioricet | levothroid pill identification | cialis eli lilly | lotensin |
BwXwibGQxP
Hello | lamisil | cheap comment leave tramadol | darvon compound | celexa | adderall | levothroid | drug metronidazole |
vXqprRDDlaMJkn
Hello | sarafem | generic name online qoclick tramadol | phentermine 37 5 mg | fioricet |
acFZUDpdmD
Hi | retin a stop using | ambien sleeping medication | valium | valium overdose death | xanax vs valium | verapamil | next day fioricet |
bhESuqAqhoOpzq
Hi | vicodin | lipitor | adipex | lipitor commercial song |
HnYifYIsOUPEGwYLu
Hi | benicar | biaxin | acetaminophen for dog | buy viagra overnight | valium |
lvqsGDccTKZGPqonlz
Hello | abilify | carisoprodol | alternative herbal review viagra | alprazolam | 1 buy mg propecia |
LkHryRggkESn
Hello | zoloft prozac differences | furosemide | tadalafil for sale | buy hostinghelpscom href tramadol | zoloft | diazepam | tramadol no prescription |