IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème avec le module tarfile


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut problème avec le module tarfile
    Bonjour,

    Je ne comprends pas d'où vient la différence entre 2 manières d'extraire un fichier d'une archive .tar

    Voici un bout de code qui montre mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    import os, tarfile, hashlib
    path = "/home/test/"
    tar_file = "/home/test/tar.tar"
    filename = "fichier.txt"
    filename2 = "fichier2.txt"
    filename3 = "fichier3.txt"
     
    def md5sum(filename):
        try:
            f = open(filename, "rb")
        except Exception as e:
            print(e)
            return ""
        md5 = hashlib.md5()
        data = f.read(128)
        while data:
            md5.update(data)
            data = f.read(128)
        f.close()
        return md5.hexdigest()
     
    with tarfile.open(tar_file, "w") as tar:
        tar.add(path+filename, arcname=filename3)
        print(md5sum(path+filename))
     
    with tarfile.open(tar_file, "r") as tar:
        member = tar.getmember(filename3)
        data = tar.extractfile(member).read()
        with open(path+filename2, "w") as f:
            f.write(data)
        print(md5sum(path+filename2))
     
     
        tar.extract(member, path=path)
        print(md5sum(path+filename))
    Seul le md5 de la méthode "tar.extract(member, path=path)" est correct

    Qu'est ce qui cloque en passant par read() ?

    D'avance merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonjour,

    J'ai lu et recopier votre script sur mon ordinateur et je vous avoue que je ne voix pas trop ce qui cloche, je n'ai pas compris quel était réellement votre problème. Peut-être est-ce moi qui est mal compris le sens de votre question.

    Pourriez-vous expliquer concrètement le cheminement de votre programme et nous pointer du doigt ce qui cloche.

    Merci d'avance...

    Mickael

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    J'ai inséré des commentaires dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import os, tarfile, hashlib
    path = "/home/test/"
    tar_file = "/home/test/tar.tar"
    filename = "fichier.txt"
    filename2 = "fichier2.txt"
    filename3 = "fichier3.txt"
     
    # Ici, on crée le fichier tar avec un fichier.txt
    with tarfile.open(tar_file, "w") as tar:
        tar.add(path+filename, arcname=filename3)
        print(md5sum(path+filename))
    # On a donc un fichier /home/test/tar.tar dont le "fichier.txt" est directement à la racine
    # On calcul le md5 du fichier original qu'on affiche
     
    # On va ouvrir le fichier /home/test/tar.tar qu'on vient juste de créer pour en extraire le fichier.
    with tarfile.open(tar_file, "r") as tar:
        # ici on récupère une structure TarInfo
        member = tar.getmember(filename3)
        # j'utilise ensuite la methode extractfile avec un .read() pour récupérer le fichier dans un buffer nommé ici "data"
        data = tar.extractfile(member).read()
        # Et enfin j'écris le buffer dans un fichier
        with open(path+filename2, "w") as f:
            f.write(data)
        # je calcule le md5 du fichier (on voit qu'il est différent)
        print(md5sum(path+filename2))
     
        # ici j'extrais le fichier directement sans passer par un buffer
        tar.extract(member, path=path)
        # je calcule le md5 (il est identique au fichier de départ)
        print(md5sum(path+filename))
    Vous allez me dire : "Pourquoi ne pas utiliser la seconde méthode qui fonctionne ?"

    Dans le cas où la structure du tar est la suivante :
    ./dossier/plop/pouet/fichier.txt

    Quand on extrait avec la seconde méthode, on obtient le fichier ici :
    /home/test/dossier/plop/pouet/fichier.txt
    Or je veux ce fichier dans un répertoire précis sans tenir compte du chemin relatif indiqué dans le tar

    J'espère avoir été plus clair.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonsoir,

    Oui c'est beaucoup plus clair, je vous remercie...
    En ce qui concerne la différence de md5, c'est normal, vous mettez les données dans un buffer "data" et vous recréez un nouveau fichier à partir des données du buffer, donc le md5 est forcément différent.

    Dans l'autre cas, vous copiez directement le fichier dans un endroit qui visiblement ne vous convient pas, mais il copie l'intégralité du fichier, avec toute ces propriétés et donc son adresse md5, c'est pour cela que dans la deuxième méthode, c'est identique.

    Je suppose que vous désirez garder l'adresse md5 et mettre tout dans une racine ^^.
    Si oui, je vais devoir encore cherché un petit peu...
    Sinon il existe toujours le bricolage pour dépanner :
    * On extrait tout dans le path : "/tmp/tempo_extra/"
    * On fait une boucle qui parcours tous les fichiers dans chaque dossier et copie les fichiers la ou vous le désirez
    * On supprime le dossier : "/tmp/tempo_extra/"

    Je continue a fouiller de mon conter...

    Mickael

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Ce que je trouve bizarre c'est que la fonction tar.add() possède un argument arcname pour ajouter le "fichier.txt" à n'importe quel endroit. Cependant il n'y a pas l'équivalent pour l'extraction...

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonsoir,

    En effet, c'est étrange, me je n'ai pas dis mon dernier mot, j'ai reformulé la partie de l'extraction pour que cela donne sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tar = tarfile.open(tar_file, "r")
    liste = tar.getnames()
    for fname in liste:
        print fname
        tar.extract(fname, "")
    Cela nous permet de voir le nom des fichiers et leurs emplacements, le mieu serait de pouvoir se placer dans un des dossiers de l'archives et à ce moment il suffirai alors d'extraire uniquement le fichier...

    Mickael

    [Edit - 13/12/2010 20:00]

    Petit édit, parce que je n'arrive pas à voir le but même si j'ai compris le principe... Si cela ne me regarde pas, faites le moi savoir :

    * Pourquoi vouloir récupéré uniquement les fichiers d'une archive sans les dossiers (il risque d'y avoir des pertes si deux fichiers on le meme nom dans des dossiers différents)
    * Dans le cas ou cela est vraiment important, le sauvegarde de l'adresse md5 l'est-il tout autant ? Sinon utliser la méthode 1

    Pour quel projet cette technique est-elle requis ?

    Mickael

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec le module AI::Categorizer
    Par Pinoute dans le forum Modules
    Réponses: 0
    Dernier message: 20/07/2007, 11h50
  2. problème avec le module TK
    Par thierry7106 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 12/05/2007, 13h50
  3. Probléme avec le module turtle
    Par Newbie46 dans le forum Général Python
    Réponses: 7
    Dernier message: 15/02/2007, 21h03
  4. problème avec le module DBI
    Par vbcasimir dans le forum SGBD
    Réponses: 6
    Dernier message: 08/10/2005, 12h48
  5. problème avec un module
    Par vbcasimir dans le forum Modules
    Réponses: 2
    Dernier message: 29/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo