RE: [Python-es] Tamaño de un objeto en python

Hernán Martínez Foffani hernan en orgmf.com.ar
Vie Jun 17 11:14:46 CEST 2005


>>> Pregunto esto por que al leer sobre funciones de
>>> entrada/salida desde archivos en python ,se me ocurrio
>>> crear un modulo para el acceso aleatorio a los
>>> registros de un archivo (en teoría un registro por
>>> linea, aunque si conosco el tamaño de cada objeto
>>> registro esto no importaría mucho) utilizando el
>>> metodo seek() de un objeto archivo
>>
>> Me imagino que quieres guardar objetos arbitrarios
>> en el archivo. ¿No te sirve pickle?
>
> Yo parto del supuesto de que el archivo ya fue creado
> con pickle, y que en el se han guardado varios objetos
> de la misma clase o tipo, entonces:

Vaya.... Ahora sí.

> si fuera el caso de que el archivo es demasiado grande
> como para utilizar el metodo load (que si no entiendo
> mal, carga todo el contendio de un archivo de una sola
> vez), y reitero, en el archivo se ha almacenado mas de
> un objeto (y no una lista de objetos)...

No.  load lee de a objetos completos.  Puedes hacer
varios load sobre un mismo stream abierto, así como podrías
hacer varios dump seguidos.  Es mas, es la única forma
en que podría haber sido creado tu archivo.
Si no fuera así, no sería posible recuperar un archivo
previamente "pickleado".

    >>> import pickle
    >>> f = file("p", "w")
    >>> pickle.dump(3, f)
    >>> pickle.dump(4, f)
    >>> f.close()
    >>> f = file("p")
    >>> pickle.load(f)
    3
    >>> pickle.load(f)
    4
    >>> f.close()
    >>>

> entonces sería posible acceder de manera directa a
> cualquier objeto dentro del archivo con solo saber que
> posición ocupa este objeto dentro de este.

Repito, en python no es posible.  Ni siquiera en caso que
se trate de un archivo pickle.  Si te fijas en el contenido
del archivo (si supuestamente es un pickle de texto y no
binario) verás que hasta un simple entero se serializa en
datos de longitud variable con marca de terminación y no
de tamaño.

En tu caso, los "varios objetos" podrían ser instancias de clases
que tengan atributos que son listas que incluyen números y
cadenas.  Cuando se serializan esos objetos tienen longitud
variable dentro del archivo.  La única manera de acceder
al, digamos, décimo objeto es haber parseado los nueve
anteriores.  Para eso es mas facil hacer 10 loads y
descartar los 9 primeros.

Si tu aplicación necesita acceso indexado utiliza el
módulo shelve en vez de pickle.

> Pido disculpas, por que no aclare que mi pregunta era
> puramente académica, es decir, no hay un problema real
> de por medio, por lo que seguramente he planteado mal
> mi inquietud.

No pasa nada. ;-)

-H.




Más información sobre la lista de distribución Python-es