Quiero crear un script para descomprimir (.tar.gz) el archivo a través de (Python)

Estoy intentando crear un script para descomprimir todos los archivos .tar.gz de las carpetas en un directorio. Por ejemplo, tendré un archivo al que llama (testing.tar.gz). Luego, si lo hago manualmente, puedo presionar para “extraer aquí”, luego el archivo .tar.gz creará un nuevo archivo y llamará a testing.tar. Finalmente, si repito el proceso de presionar “extraer aquí”, el archivo .tar produce todos los archivos .pdf.

Me pregunto cómo puedo hacerlo, y tengo mi código aquí y parece que realmente no funciona.

import os import tarfile import zipfile def extract_file(path, to_directory='.'): if path.endswith('.zip'): opener, mode = zipfile.ZipFile, 'r' elif path.endswith('.tar.gz') or path.endswith('.tgz'): opener, mode = tarfile.open, 'r:gz' elif path.endswith('.tar.bz2') or path.endswith('.tbz'): opener, mode = tarfile.open, 'r:bz2' else: raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path cwd = os.getcwd() os.chdir(to_directory) try: file = opener(path, mode) try: file.extractall() finally: file.close() finally: os.chdir(cwd) 

¿Por qué quieres “presionar” dos veces para extraer un .tar.gz, cuando puedes hacerlo fácilmente una vez? Aquí hay un código simple para extraer .tar y .tar.gz de una sola vez:

 import tarfile if (fname.endswith("tar.gz")): tar = tarfile.open(fname, "r:gz") tar.extractall() tar.close() elif (fname.endswith("tar")): tar = tarfile.open(fname, "r:") tar.extractall() tar.close() 

Aquí hay una opción más simple:

 import envoy # pip install envoy def tar_xzf(f): r = envoy.run("tar xzf %s -C %s" % (f, "directory")) 

Cuando ejecuté su progtwig, funcionó perfectamente para un archivo tar.gz y .tgz, no me dio los elementos correctos cuando abrí el zip, pero .tbz fue el único que generó un error. Creo que usaste el método incorrecto para descomprimir un .tbz porque el error decía que tenía un tipo de archivo incorrecto, pero no lo hice. Una forma en que podría resolver el problema de .zip es con nosotros os.command () y descomprimirlo con una línea de comando (dependiendo de su sistema operativo) porque devolvió una carpeta _MACOSX sin nada dentro de ella aunque ingresé la ruta correctamente. El único otro error que encontré fue que usaste una syntax incorrecta para generar un error.
Esto es lo que deberías haber usado:

 raise ValueError("Error message here") 

Usaste una coma y ningún paréntesis. ¡Espero que esto ayude!