2011-12-06 14 views

Respuesta

0

Puede usar TarFile.extractfile(member) para extraer un archivo específico.

Devuelve un objeto similar a un archivo (Python típico) que luego puede usar para escribir los contenidos en un archivo en cualquier ubicación que desee.

+0

que funcionaría, pero doesn no conserva los metadatos del archivo (tiempo de modificación, etc.). –

2

Según el módulo tarfile, puede hacerlo fácilmente. Aún no lo he comprobado.

TarFile.extract(member, path="") 

Documentación:

Extracto de un miembro del archivo en el directorio de trabajo actual, utilizando su nombre completo. Su información de archivo se extrae con la mayor precisión posible. miembro puede ser un nombre de archivo o un objeto TarInfo. Puede especificar un directorio diferente usando la ruta.

Por lo que debe ser capaz de hacer

TarFile.extract(member, path=".") 

Véase la documentación completa en: http://docs.python.org/library/tarfile.html

+0

Cuando los documentos dicen "al directorio de trabajo actual, usando su nombre completo", el "nombre completo" es en realidad una ruta. Podrían decir con más precisión "utilizando su ruta completa, comenzando desde el directorio de trabajo actual ... Puede especificar un directorio de inicio diferente utilizando la ruta". Entonces esta respuesta no funcionará. La respuesta de ekhumoro parece mejor. – Weeble

7

Los atributos de datos de un objeto TarInfo se puede escribir. Por lo que sólo cambiar el name a lo que usted quiere y luego extraerlo:

import sys, os, tarfile 

args = sys.argv[1:] 
tar = tarfile.open(args[0]) 
member = tar.getmember(args[1]) 
member.name = os.path.basename(member.name) 
path = args[2] if len(args) > 2 else '' 
tar.extract(member, path) 
+0

+1 para el recordatorio sobre 'os.path.basename()' – metasequoia

9

me encuentro con este problema también, y la lista del ejemplo completo basado en la respuesta de ekhumoro

import os, tarfile 
output_dir = "." 
tar = tarfile.open(tar_file) 
for member in tar.getmembers(): 
    if member.isreg(): # skip if the TarInfo is not files 
    member.name = os.path.basename(member.name) # remove the path by reset it 
    tar.extract(member,output_dir) # extract 
Cuestiones relacionadas