2011-11-04 14 views
6

Estoy trabajando en un proyecto en python en el que necesito extraer solo una subcarpeta de archivo tar no todos los archivos. He intentado utilizarExtraer solo un directorio de tar

tar = tarfile.open(tarfile) 
tar.extract("dirname", targetdir) 

Pero esto no funciona, que no extrae el subdirectorio dado también sin excepción. Soy un principiante en Python. Además, si la función anterior no funciona para directorios ¿cuál es la diferencia entre este comando y tar.extractfile()?

+0

extractfile() no escribir un archivo en el disco, sólo se le da una objeto python. extract() escribe en el disco. –

Respuesta

11

Basándose en el segundo ejemplo de la tarfile module documentation, se podía extraer la subcarpeta contenida y todo su contenido con algo como esto:

with tarfile.open("sample.tar") as tar: 
    subdir_and_files = [ 
     tarinfo for tarinfo in tar.getmembers() 
     if tarinfo.name.startswith("subfolder/") 
    ] 
    tar.extractall(members=subdir_and_files) 

Esto crea una lista de la subcarpeta y su contenido, y luego usa el método extractall() recomendado para extraer solo ellos. Por supuesto, reemplace "subfolder/" con la ruta real (relativa a la raíz del archivo tar) de la subcarpeta que desea extraer.

4

La otra respuesta retendrá la ruta de la subcarpeta, lo que significa que subfolder/a/b se extraerá a ./subfolder/a/b. Para extraer una subcarpeta a la raíz, por lo subfolder/a/b se extraería a ./a/b, puede volver a escribir los caminos con algo como esto:

def members(tf): 
    l = len("subfolder/") 
    for member in tf.getmembers(): 
     if member.path.startswith("subfolder/"): 
      member.path = member.path[l:] 
      yield member 

with tarfile.open("sample.tar") as tar: 
    tar.extractall(members=members(tar)) 
+0

Funciona muy bien. También puede cambiar el nombre de la carpeta de nivel superior con este estilo haciendo 'member.path = os.path.join ('new_dirname', member.path [l:])' – Blake

Cuestiones relacionadas