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?
¿Por qué no está esto en archivos separados de Python? 'python download.py | python extract.py | python filter.py'? –
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? –