a ver como describo la pregunta....
Tengo un registro, tal que nombre, apellidos, etc... con una longitud fija en bytes.
Estos registros los grabo en un fichero en binario 'w+b'. Hasta aqui simple.
Ahora supongamos que tengo dos millones de registros con una longituda cada uno de 2048 bytes.
Ahora quiero acceder a un registro, por su clave/num_registro, en concreto, sin llevar el archivo a memoria. He ojeado las librerías shelve y anydbm, pero carga todo el fichero; y para ficheros muy grandes no se puede. Por una particularidad que no viene al caso no debo hacerlo en sql.
Pongo un ejemplo en pascal para que se vea lo que busco, a ver si es posible hacerlo en python con alguna librería que desconozco.
y para buscar un registro concreto solo tendría que hacer:
Lo más parecido que he encontrado en python a la estructura record de pascal es namedtuples:
Edito:
Para la estructura del registro ya he encontrado una librería que me sirve:
recordtype 1.1
[/url]
[url=https://pypi.python.org/pypi/recordtype]
Tengo un registro, tal que nombre, apellidos, etc... con una longitud fija en bytes.
Estos registros los grabo en un fichero en binario 'w+b'. Hasta aqui simple.
Ahora supongamos que tengo dos millones de registros con una longituda cada uno de 2048 bytes.
Ahora quiero acceder a un registro, por su clave/num_registro, en concreto, sin llevar el archivo a memoria. He ojeado las librerías shelve y anydbm, pero carga todo el fichero; y para ficheros muy grandes no se puede. Por una particularidad que no viene al caso no debo hacerlo en sql.
Pongo un ejemplo en pascal para que se vea lo que busco, a ver si es posible hacerlo en python con alguna librería que desconozco.
Código:
Type
datos = record
clave : integer;
nombre : string[30];
puesto : string[20];
sueldo : real;
estado : boolean;
end;
Var
valores : datos
archivo : file of datos;
Begin
Assign(archivo,'empleado.dat');
ReWrite(aechivo);
valores.clave = 1;
...
valores.estado = ....
close(archivo);
end
y para buscar un registro concreto solo tendría que hacer:
Código:
Seek(miFichero, num_registro);
Lo más parecido que he encontrado en python a la estructura record de pascal es namedtuples:
Código:
>>> from collections import namedtuple
>>> Persona = namedtuple('Persona', ['nombre', 'apellidos'])
>>> p = Persona('Pepe', 'Perez')
>>> p
Persona(nombre='Pepe', apellidos='Perez')
>>> p.nombre
'Pepe'
>>> datos = ['juan', 'dominguez']
>>> Persona._make(datos)
Persona(nombre='juan', apellidos='dominguez')
>>> p
Persona(nombre='Pepe', apellidos='Perez')
>>> p._asdict()
OrderedDict([('nombre', 'Pepe'), ('apellidos', 'Perez')])
>>> p._fields
('nombre', 'apellidos')
>>> getattr(p, 'apellidos')
'Perez'
Para la estructura del registro ya he encontrado una librería que me sirve:
recordtype 1.1
[/url]
[url=https://pypi.python.org/pypi/recordtype]