¿Cómo se pueden añadir archivos a un archivo tar con Python, sin añadir la jerarquía de directorios?

StackOverflow https://stackoverflow.com/questions/2239655

  •  19-09-2019
  •  | 
  •  

Pregunta

Cuando invoco add() en un objeto tarfile con una ruta de archivo, el archivo se añade al archivo comprimido con la jerarquía de directorios asociados. En otras palabras, si descomprimir el archivo tar los directorios de la jerarquía de directorios originales se reproducen.

¿Hay una manera de la simple adición de un archivo plano sin información de directorio que desempaquetar el paquete de archivos resultantes producen una lista plana de archivos?

¿Fue útil?

Solución

Puede utilizar tarfile.addfile() , en el objeto TarInfo , que es el primer parámetro, puede especificar un name que es diferente del archivo que 're adición.

Esta pieza de código debe añadir /path/to/filename en el fichero de alquitrán, sino que va a extraer como myfilename:

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))

Otros consejos

La arco argumento de TarFile.add () método es una alternativa y una manera conveniente para que coincida con su destino.

Ejemplo: desea archivar un directorio repo / a.git / a un archivo tar.gz , pero más bien desea que la raíz de un árbol en el archivo comienza por a.git / pero no repo / a.git / , se puede hacer como siguientes:

archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()

Tal vez se puede usar el argumento "arcname" a TarFile.add (nombre, arcname). Se necesita un nombre alternativo que el archivo tendrá dentro del archivo.

gracias a @diabloneo, función para crear tarball selectiva de un dir

def compress(output_file="archive.tar.gz", output_dir='', root_dir='.', items=[]):
    """compress dirs.

    KWArgs
    ------
    output_file : str, default ="archive.tar.gz"
    output_dir : str, default = ''
        absolute path to output
    root_dir='.',
        absolute path to input root dir
    items : list
        list of dirs/items relative to root dir

    """
    os.chdir(root_dir)
    with tarfile.open(os.path.join(output_dir, output_file), "w:gz") as tar:
        for item in items:
            tar.add(item, arcname=item)    


>>>root_dir = "/abs/pth/to/dir/"
>>>compress(output_file="archive.tar.gz", output_dir=root_dir, 
            root_dir=root_dir, items=["logs", "output"])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top