web-dev-qa-db-fra.com

Comment extraire un fichier tar en utilisant python 2.4?

J'essaie d'extraire un fichier .tar complètement en utilisant python 2.4.2 et pour cette raison, tous les aspects du module tarfile ne sont pas utilisables. J'ai parcouru le python et je ne l'ai pas trouvé utile car je continue à faire des erreurs de syntaxe. Voici les commandes que j'ai essayées (sans succès):

tarfile.Tarfile.getnames(tarfile.tar)
tarfile.Tarfile.extract(tarfile.tar)

Existe-t-il un moyen simple d'extraire complètement mon goudron? Si oui, quelle est la mise en forme utilisée? Aussi, je voudrais noter que tarfile.TarFile.extractall () n'est pas disponible dans ma version python.

13
Connor Tepfer

Cet exemple provient des documents tarfile .

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

Tout d'abord, un objet TarFile est créé à l'aide de tarfile.open(), puis tous les fichiers sont extraits à l'aide de extractall() et enfin l'objet est fermé.

Si vous souhaitez extraire vers un autre répertoire, utilisez paramètre extractallpath :

tar.extractall(path='/home/connor/')

Edit: Je vois maintenant que vous utilisez une ancienne version Python qui n'a pas la fonction TarFile.extractall() méthode. La documentation pour les anciennes versions de tarfile le confirme. Vous pouvez à la place faire quelque chose comme ceci:

for member in tar.getmembers():
    print "Extracting %s" % member.name
    tar.extract(member, path='/home/connor/')

Si votre fichier tar contient des répertoires, cela échoue probablement (je ne l'ai pas testé). Pour une solution plus complète, voir Implémentation Python 2.7 de extractall

Edit 2: Pour une solution simple utilisant votre ancienne version Python version, appelez la commande tar = en utilisant subprocess.call

import subprocess
tarfile = '/path/to/myfile.tar'
path = '/home/connor'
retcode = subprocess.call(['tar', '-xvf', tarfile, '-C', path])
if retcode == 0:
    print "Extracted successfully"
else:
    raise IOError('tar exited with code %d' % retcode)
31
André Laszlo

Voici le code plus général de bibliothèque torchvision :

import os
import hashlib
import gzip
import tarfile
import zipfile

def _is_tarxz(filename):
    return filename.endswith(".tar.xz")


def _is_tar(filename):
    return filename.endswith(".tar")


def _is_targz(filename):
    return filename.endswith(".tar.gz")


def _is_tgz(filename):
    return filename.endswith(".tgz")


def _is_gzip(filename):
    return filename.endswith(".gz") and not filename.endswith(".tar.gz")


def _is_Zip(filename):
    return filename.endswith(".Zip")


def extract_archive(from_path, to_path=None, remove_finished=False):
    if to_path is None:
        to_path = os.path.dirname(from_path)

    if _is_tar(from_path):
        with tarfile.open(from_path, 'r') as tar:
            tar.extractall(path=to_path)
    Elif _is_targz(from_path) or _is_tgz(from_path):
        with tarfile.open(from_path, 'r:gz') as tar:
            tar.extractall(path=to_path)
    Elif _is_tarxz(from_path):
        with tarfile.open(from_path, 'r:xz') as tar:
            tar.extractall(path=to_path)
    Elif _is_gzip(from_path):
        to_path = os.path.join(to_path, os.path.splitext(os.path.basename(from_path))[0])
        with open(to_path, "wb") as out_f, gzip.GzipFile(from_path) as Zip_f:
            out_f.write(Zip_f.read())
    Elif _is_Zip(from_path):
        with zipfile.ZipFile(from_path, 'r') as z:
            z.extractall(to_path)
    else:
        raise ValueError("Extraction of {} not supported".format(from_path))

    if remove_finished:
        os.remove(from_path)
0
Shital Shah