2011-11-24 15 views
7

Tengo un archivo tar en el que tengo un directorio que necesito extraer en un directorio determinado. Por ejemplo: I tienen un directorioExtraiga todos los archivos con la ruta del directorio en el directorio dado

TarPrefix/x/y/z

en un archivo tar Quiero extraerlo en un directorio de destino dado por ejemplo: extraído/a/este directorio debe contener todos los archivos y directorios contenidos en el directorio TarPrefix/x/y/z.

subdir_and_files = [ tarinfo for tarinfo in tar.getmembers() 
         if tarinfo.name.startswith("subfolder/") 
        ] 

para obtener la lista de todos los miembros en la ruta del directorio "subcarpeta /" y luego extraerla utilizando tar.extractall(extracted/a,subdir_and_files) pero extrae todos los miembros con su ruta de directorio Por ejemplo, esto se traduce en extraída/a/x/y/z. ¿Podría ayudarme a extraer estos archivos en la carpeta indicada?

+0

No sé, pero esta cuestión parece ser una especie de lo contrario de la suya: http: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy Quizás puedas usar extract() en lugar de extractall() y ver qué puedes hacer, posiblemente modificando los objetos TarInfo que tienes conseguido en subdir_and_files? –

+1

Perdón por hacer una pregunta para principiantes. Soy un principiante en Python y no encontré ninguna respuesta en google por eso hice esa pregunta. Para ayudar a otros, quiero responder esta pregunta. Solo necesita cambiar el valor del atributo tarinfo.name al valor correcto. es decir, en mi ejemplo dado 'tarinfo.name = tarinfo.name [len (Tarprefix/x/y/z):]' y luego usar el mismo código funciona. – gaurav

+0

Traté de responder mi propia pregunta, pero no estoy autorizado hasta las ocho horas, así que estaba esperando hasta entonces. – gaurav

Respuesta

12

Parece que es probable que haya encontrado una respuesta, pero aquí está mi versión de todos modos:

import sys, tarfile 

def get_members(tar, prefix): 
    if not prefix.endswith('/'): 
     prefix += '/' 
    offset = len(prefix) 
    for tarinfo in tar.getmembers(): 
     if tarinfo.name.startswith(prefix): 
      tarinfo.name = tarinfo.name[offset:] 
      yield tarinfo 

args = sys.argv[1:] 

if len(args) > 1: 
    tar = tarfile.open(args[0]) 
    path = args[2] if len(args) > 2 else '.' 
    tar.extractall(path, get_members(tar, args[1])) 
+0

Gracias por ayudarme. Ya encontré la respuesta experimentando con cosas :). De todos modos muchas gracias. – gaurav

2
with tarfile.open('sourcefile.tgz', 'r:gz') as _tar: 
    for member in _tar: 
     if member.isdir(): 
     continue 
     fname = member.name.rsplit('/',1)[1] 
     _tar.makefile(member, 'desination_dir' + '/' + fname) 
+0

describe algo sobre tu respuesta. – Satendra

Cuestiones relacionadas