create - Usando el módulo GZIP con Python
gzip python 3 (5)
Creo que hay una solución mucho más simple que las otras presentadas, dado que la operación solo quería extraer todos los archivos en un directorio:
import glob
from setuptools import archive_util
for fn in glob.glob(''*.gz''):
archive_util.unpack_archive(fn, ''.'')
Estoy intentando usar el módulo Python GZIP para simplemente descomprimir varios archivos .gz en un directorio. Tenga en cuenta que no quiero leer los archivos, solo descomprimirlos. Después de buscar en este sitio por un tiempo, tengo este segmento de código, pero no funciona:
import gzip
import glob
import os
for file in glob.glob(PATH_TO_FILE + "/*.gz"):
#print file
if os.path.isdir(file) == False:
shutil.copy(file, FILE_DIR)
# uncompress the file
inF = gzip.open(file, ''rb'')
s = inF.read()
inF.close()
los archivos .gz están en la ubicación correcta, y puedo imprimir la ruta completa + nombre de archivo con el comando de impresión, pero el módulo GZIP no se está ejecutando correctamente. ¿Qué me estoy perdiendo?
Debe usar with
para abrir archivos y, por supuesto, almacenar el resultado de leer el archivo comprimido. Ver la documentación de gzip
:
import gzip
import glob
import os
import os.path
for gzip_path in glob.glob("%s/*.gz" % PATH_TO_FILE):
if not os.path.isdir(gzip_path):
with gzip.open(gzip_path, ''rb'') as in_file:
s = in_file.read()
# Now store the uncompressed data
path_to_store = gzip_fname[:-3] # remove the ''.gz'' from the filename
# store uncompressed file data from ''s'' variable
with open(path_to_store, ''w'') as f:
f.write(s)
Dependiendo de qué es exactamente lo que quieres hacer, es posible que desees ver el tarfile
y su opción ''r:gz''
para abrir archivos.
Estás descomprimiendo el archivo en s
variable s
, y no hagas nada con él. Debería dejar de buscar y leer al menos el tutorial de Python. Seriamente.
De todos modos, hay varias cosas mal con su código:
lo que necesita es ALMACENAR los datos descomprimidos en
s
en algún archivo.no hay necesidad de copiar los archivos reales
*.gz
. Porque en su código, está desempaquetando el archivo gzip original y no la copia.estás usando el
file
, que es una palabra reservada, como una variable. Esto no es un error, solo una muy mala práctica.
Esto probablemente debería hacer lo que querías:
import gzip
import glob
import os
import os.path
for gzip_path in glob.glob(PATH_TO_FILE + "/*.gz"):
if os.path.isdir(gzip_path) == False:
inF = gzip.open(gzip_path, ''rb'')
# uncompress the gzip_path INTO THE ''s'' variable
s = inF.read()
inF.close()
# get gzip filename (without directories)
gzip_fname = os.path.basename(gzip_path)
# get original filename (remove 3 characters from the end: ".gz")
fname = gzip_fname[:-3]
uncompressed_path = os.path.join(FILE_DIR, fname)
# store uncompressed file data from ''s'' variable
open(uncompressed_path, ''w'').write(s)
Pude resolver este problema usando el módulo de subproceso:
for file in glob.glob(PATH_TO_FILE + "/*.gz"):
if os.path.isdir(file) == False:
shutil.copy(file, FILE_DIR)
# uncompress the file
subprocess.call(["gunzip", FILE_DIR + "/" + os.path.basename(file)])
Como mi objetivo era simplemente descomprimir el archivo, el código anterior lo logra. Los archivos archivados se encuentran en una ubicación central, se copian en un área de trabajo, se descomprimen y se utilizan en un caso de prueba. El módulo GZIP era demasiado complicado para lo que estaba tratando de lograr.
Gracias por la ayuda de todos. ¡Es muy apreciado!
Si no recibe ningún error, el módulo gzip probablemente se está ejecutando correctamente.
No quiero leer los archivos, solo descomprimirlos.
El módulo gzip
no funciona como un programa de archivo de escritorio como 7-zip; no puede "descomprimir" un archivo sin "leerlo". Lo que probablemente quiere decir con "descomprimir" se describe con mayor precisión, desde un punto de vista de programación, como "lee un flujo desde un archivo comprimido y escríbelo en un archivo nuevo".
inF = gzip.open(file, ''rb'')
s = inF.read()
inF.close()
Aquí, solo estás leyendo la corriente. Solo necesitas escribirlo en un nuevo archivo:
inF = gzip.open(file, ''rb'')
outF = open(outfilename, ''wb'')
outF.write( inF.read() )
inF.close()
outF.close()