2010-08-23 14 views
6

Me gustaría descargar, extraer e iterar sobre un archivo de texto en Python sin tener que crear archivos temporales.Descargar, extraer y leer un archivo gzip en Python

básicamente, este tubo, pero en Python

curl ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz | gunzip | processing step 

Aquí está mi código:

def main(): 
    import urllib 
    import gzip 

    # Download SEED database 
    print 'Downloading SEED Database' 
    handle = urllib.urlopen('ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz') 


    with open('SEED.fasta.gz', 'wb') as out: 
     while True: 
      data = handle.read(1024) 
      if len(data) == 0: break 
      out.write(data) 

    # Extract SEED database 
    handle = gzip.open('SEED.fasta.gz') 
    with open('SEED.fasta', 'w') as out: 
     for line in handle: 
      out.write(line) 

    # Filter SEED database 
    pass 

no quiero utilizar process.Popen() o algo porque quiero a este script ser independiente de la plataforma.

El problema es que la biblioteca Gzip solo acepta nombres de archivo como argumentos y no como identificadores. La razón de "canalización" es que el paso de descarga solo utiliza hasta ~ 5% de CPU y sería más rápido ejecutar la extracción y el procesamiento al mismo tiempo.


EDITAR: Esto no va a funcionar porque

"Debido a la compresión gzip manera obras, GzipFile necesita para salvar su posición y desplazarse hacia delante y hacia atrás a través de la comprimido archivo . Esto no funciona cuando el "archivo" es una secuencia de bytes procedente de un servidor remoto; todo lo que puede hacer con él es retri cada cinco bytes uno a la vez, no mueva hacia adelante y hacia atrás a través de la secuencia de datos ". - dive into python

por lo que me sale el error

AttributeError: addinfourl instance has no attribute 'tell' 

Entonces, ¿cómo curl url | gunzip | whatever trabajo?

+1

¿Por qué no está esto en archivos separados de Python? 'python download.py | python extract.py | python filter.py'? –

+0

Porque ejecutar scripts de Python desde los comandos del sistema desde los scripts de Python es complicado. Además, dije que quería que esto sea independiente de la plataforma (lo que significa que las personas que usan Windows no tendrán ningún problema) y la ejecución de comandos del sistema lo dificulta. ¿El DOS incluso admite tuberías? –

Respuesta

9

y estará en camino, en otras palabras, no es realmente cierto que "la biblioteca Gzip solo acepta nombres de archivo como argumentos y no como identificadores", solo tiene que usar el argumento fileobj= con nombre.

+0

¡Gracias! No lo vi en el docu. –

+0

@Austin, de nada! –

+1

Tenga en cuenta que el objeto de archivo debe ser compatible con 'seek'. – Andrey

Cuestiones relacionadas