[Python-es] Buscar, leer y escribir archivos grandes con Python

Manuel Enrique González Ramírez maengora en gmail.com
Jue Jun 2 23:32:20 CEST 2011


Hola a tod en s,

Tengo la siguiente situación:

Un archivo de 29Mb que contiene 281.351 lineas.  El archivo tiene la
siguiente estructura:

1|2011-05-20 23:08:56|122711527|OPERADOR1|HOST TO HOST|212454|10000|HOST
CLIENTE|192630167
2|2011-05-20 23:09:08|122711530|OPERADOR12|HOST TO
HOST|57212454|1000|HOST CLIENTE|192630168
3|2011-05-20 23:09:42|122711538|OPERADOR1|HOST TO
HOST|454545454545|2000|HOST CLIENTE|192630169
4|2011-05-20 23:10:03|122711544|OPERADOR1|HOST TO
HOST|121221211|20000|HOST CLIENTE|192630170
5|2011-05-20 23:10:09|122711547|OPERADOR1|HOST TO HOST
ESPECIAL|4545|5000|HOST CLIENTE|192630171
6|2011-05-20 23:10:46|122711554|OPERADOR1|HOST TO HOST
ESPECIAL|545454445|5000|HOST CLIENTE|192630172
.
.
Del cual debo capturar la última sección, es decir, el número que me
representa una secuencia (192630167, 192630168, etc).

Lo hago así:

fc = open('archivo.txt','r')

for linea in fc:
    b = linea.rfind('|')
    posi = b + 1
    posf = posi + 9
    secuenciac = linea[posi:posf]
    print secuenciac

Esto tarda en promedio 3 minutos (que es demasiado comparado con el tiempo
que tarda [1min en promedio] con el script que me pasaron en Perl).

Ahora, para sumarle al problema del tiempo que tarda dicha proceso, el
resultado del ciclo anterior debe escribirse en otro archivo (datos.csv);
eso lo hago así:

# Abro un archivo para edición
    fdif = open('datos.csv','a')
    fdif.writelines('"'+secuenciac+'"; \n')
    fdif.close()

Y esto eleva exponencialmente el tiempo.  :(

Estuve buscando en San Google y en un hilo anterior (así como en e foro de
majibu) obtuve documentación donde se habla de lectura de archivos enormes
con python usando un mínimo de tiempo:

http://effbot.org/zone/wide-finder.htm

def process(file, chunk):
    f = open(file)
    f.seek(chunk[0])
    d = defaultdict(int)
    for page in pat.findall(f.read(chunk[1])):
        d[page] += 1
    return


Perdón pero no acabo de entender cómo implementar algo que me funcione
utilizando el mínimo de tiempo como dicen que sucede por ejemplo con el
process anterior.

Se que se puede mejorar dichas situaciones pero lo poco que aún se de Python
no me deja ser más eficiente (.. y es que mi ignorancia es infinita)

Alguien me puede colaborar???


Muchas gracias.



-- 
Manuel Enrique González Ramírez
http://maengora.blogspot.com
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110602/a2323851/attachment.html>


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