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 :

BZip d'un répertoire avec tarfile


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut BZip d'un répertoire avec tarfile
    Hello,
    J'essaie de faire un Bzip d'un répertoire. J'entends par là, avoir une archive qui contient à sa racine tout les sous-répertoires (+récursion) d'un répertoire Root:

    Exemple avec la structure suivante pour le répertoire de Path c:\Root
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Root
       -Rep A
       -Rep B
       -Rep C
    J'ai essayé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fd,path = mkstemp(suffix=".bz2"); #-> path = C:\temp\tmp2zrpqb0w.bz2
    with tarfile.open(path, "w:bz2") as tar:
            tar.add("c:\Root", arcname=os.path.sep);
    Seulement quand j'ouvre mon Archive tmp2zrpqb0w.bz2 j'ai un premier niveau parasite qui porte son nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tmp2zrpqb0w.bz2
             -tmp2zrpqb0w
                  -Rep A
                  -Rep B
                  -Rep C
    Alors que je voudrais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tmp2zrpqb0w.bz2
             -Rep A
             -Rep B
             -Rep C
    Ou à la Rigueur pouvoir contrôler le nom de de cette root directory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tmp2zrpqb0w.bz2
             -MonNomAMoi
                  -Rep A
                  -Rep B
                  -Rep C
    D'avance merci pour votre aide.

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Il faut que ton fichier contienne 2 extensions, tar et bz2, donc pour une archive du nom de toto, alors il faut aboutir à obtenir comme nom d'archive toto.tar.bz2

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Hello,
    Merci pour ton message bistouille.
    Pour simplifié, j'ai utilisé un PATH de fichier en dure pour respecter tes recommandations de nomage.
    J'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    path = "C:/temp/MyArchive.tar.bz2"
    with tarfile.open(path, "w:bz2") as tar:
            tar.add("c:\Root", arcname=os.path.sep);
    Mais ça ne change rien au résultat. J'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyArchive.tar.bz2
             -MyArchive.tar
                  -Rep A
                  -Rep B
                  -Rep C
    Alors que je cherche à avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyArchive.tar.bz2
             -Rep A
             -Rep B
             -Rep C
    D'avance merci

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Tu ne peux pas.

    Par définition le .tar.bz est une compression bz d'un fichier tar (qui est lui meme une archive). Donc Un fichier .tar.bz contient nécéssairement à sa racine un .tar.

    Si cela vous lmimite, il faut considérer un autre format (.zip ?).

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci lg_53. Effectivement, j'ai cherché sur le Web avec ces infos, et visiblement BZip2 ne fait pas les multi-fichiers :-)
    Du coup, je me retranche derrière ma 2ème possibilité, avoir une arborescence du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tmp2zrpqb0w.tar.bz2
             -MonNomAMoi.tar
                  -Rep A
                  -Rep B
                  -Rep C
    Je ne maitrise pas le nom de l'archive que l'on me donne (tmp2zrpqb0w), mais j'aimerais contrôler le nom du tar embarqué.
    Est-ce envisageable ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    Je ne maitrise pas le nom de l'archive que l'on me donne (tmp2zrpqb0w), mais j'aimerais contrôler le nom du tar embarqué.
    Est-ce envisageable ?
    Le nom du tar embarqué est dérivé (par défaut) du nom du fichier.
    Si vous voulez les changer, il va falloir ouvrir le fichier, passer l'argument fileobj à tarfile.open et préciser le nom via name=...
    note: ce nom n'est pas une simple chaîne de caractères. pour un simple fichier tar, çà marche tout seul, pour une combinaison tar.bz2 je n'ai pas trouvé la formule magique.

    - W

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    En fait, pour ma part je ne comprends pas où est le problème qui est plus lié au logiciel faisant la décompression de données qu'autre chose.

    Si l'intention est de faire une archive qui devra être utilisable par d'autres utilisateurs, alors il sera mieux de choisir un type d'archive plus « standard » et mieux supporté par tous les systèmes (tar c'est plus un truc unix, comme rar un truc proprio windows). Mais si l'intention est de faire des archives uniquement utilisables par l'application, bah pas de problèmes puisqu'en faisant la décompression avec tarfile, cela devrait bien donner ce qui a été archivé, enfin en théorie.

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    hello wiztricks,
    En fait je me suis peut être mal exprimé je crois. quand j'ai dis "Je ne maitrise pas le nom de l'archive que l'on me donne (tmp2zrpqb0w)" je parle bien du nom. L'appli appelante ne me donne pas une Archive, mais bien juste un nom. Donc je ne peux pas faire d'OPEN sur celle-ci. Peux-tu donner un exemple de code de ce que tu avais en tête?

    Hello bistouille,
    L'archive est bien destinée à des utilisateur UNIX. Elles sont volumineuses, et on a fait des test en amont pour voir les taux de compression, et tar.bz2 surclassait tout les autres types.

    merci.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    L'appli appelante ne me donne pas une Archive, mais bien juste un nom. Donc je ne peux pas faire d'OPEN sur celle-ci. Peux-tu donner un exemple de code de ce que tu avais en tête?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f = open('nimportequoi', 'wb')
    g = tarfile.open(name='autrenom', fileobj=f)
    - W

  10. #10
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    Hello bistouille,
    L'archive est bien destinée à des utilisateur UNIX. Elles sont volumineuses, et on a fait des test en amont pour voir les taux de compression, et tar.bz2 surclassait tout les autres types.

    merci.


    Et bien dans ce cas, il n'y a aucun problème, puisqu'un simple extracteur d'archives (ou une commande tar) décompressera correctement l'archive pour peu qu'elle possède bien une extension .tar.bz2, j'ai d'ailleurs testé en compressant sur windows et en décompressant sur linux, aucun souci à signaler. Le problème est que tu visualises ton archive sur windows (enfin je suppose), d'où le problème de voir le tar dans le bzip qui au final n'en est pas un.

  11. #11
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Un peu de lecture sur ces formats ne ferait pas de mal je pense

    https://fr.wikipedia.org/wiki/Tar_(informatique)

    Le .bz2 contient bien un .tar car bz2 est un algo de compression qui permet de compresser un seul et unique fichier. Le tar fait donc ce job : il transforme un dossier en seulement un gros fichier, qu'ensuite bz2 pourra compresser. C'est comme cela, c'est la manière usuelle de faire. Et même sous unix, on peut séparer la commande décompression en 2, et repasser par le tar, bien qu'il existe des raccourcis souvent utilisés pour masquer cette étape intermédiaire et retrouver directement les fichiers de départ à partir du tar.bz2. Quoi qu'il en soit on a donc toujours deux étapes, la premiere étant le passage par un .tar. Après le fait qu'il y ait c'est 2 étapes n'est pas forcément explicite à cause de tous ces raccourcis dont nous disposons.

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Hello,
    Merci pour vos réponses. Je rentre de congés et viens d'essayer vos proposition.

    Merci lg_53, maintenant je comprends pourquoi en choisissant BZIP2 j'aurai un .tar intermédiaire dans mon archive.

    Merci wiztricks pour l'exemple. J'ai testé et je n'ai pas l'impression que ça marche pour moi, ou alors j'ai fait une erreur.
    Comme expliqué, je reçois un nom d'archive que je ne maîtrise pas ainsi qu'un répertoire contenant des Sous-Reps:
    inputs:
    archiveNamePath = "E:\tmp\xyz.tar.bz2"
    contentRepPath = "E:\data\content"

    E:\data\content contient les sous-Reps (SubRep_A,SubRep_B,SubRep_C)
    je veux créer l'archive E:\tmp\xyz.tar.bz2 telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xyz.tar.bz2 
             -MonNomAMoi.tar
                  -SubRep_A
                  -SubRep_B
                  -SubRep_C
    En suivant ton exemple, mon code donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    archiveNamePath = "E:\tmp\xyz.tar.bz2"; #input
    contentRepPath = "E:\data\content"; #input
     
    archiveFile = open(archiveNamePath, 'wb');
    with tarfile.open(name='MonNomAMoi', mode='x:bz2' ,fileobj=archiveFile) as tar:
    	tar.add(contentRepPath, arcname=os.path.sep);
    L'archive qui est créé ne prend toujours pas en compte le nom du tar 'MonNomAMoi'. Au final j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xyz.tar.bz2 
             -xyz.tar
                  -SubRep_A
                  -SubRep_B
                  -SubRep_C
    Y'a-t'il une erreur dans mon code, où je m'étais mal exprimé ?
    D'avance merci.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    Merci wiztricks pour l'exemple. J'ai testé et je n'ai pas l'impression que ça marche pour moi, ou alors j'ai fait une erreur.
    Si vous relisez ma réponse, vous verriez que je ne suis pas arrivé à le faire fonctionner non plus sauf pour .tar et pour .tgz.
    Et je n'ai pas de temps pour aller comprendre ce que fait le module tarfile.py dans ces cas là.
    Désolé

    - W

  14. #14
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par crashXpert Voir le message
    Hello,
    Merci pour vos réponses. Je rentre de congés et viens d'essayer vos proposition.

    Merci lg_53, maintenant je comprends pourquoi en choisissant BZIP2 j'aurai un .tar intermédiaire dans mon archive.

    Merci wiztricks pour l'exemple. J'ai testé et je n'ai pas l'impression que ça marche pour moi, ou alors j'ai fait une erreur.
    Comme expliqué, je reçois un nom d'archive que je ne maîtrise pas ainsi qu'un répertoire contenant des Sous-Reps:
    inputs:
    archiveNamePath = "E:\tmp\xyz.tar.bz2"
    contentRepPath = "E:\data\content"

    E:\data\content contient les sous-Reps (SubRep_A,SubRep_B,SubRep_C)
    je veux créer l'archive E:\tmp\xyz.tar.bz2 telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xyz.tar.bz2 
             -MonNomAMoi.tar
                  -SubRep_A
                  -SubRep_B
                  -SubRep_C
    En suivant ton exemple, mon code donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    archiveNamePath = "E:\tmp\xyz.tar.bz2"; #input
    contentRepPath = "E:\data\content"; #input
     
    archiveFile = open(archiveNamePath, 'wb');
    with tarfile.open(name='MonNomAMoi', mode='x:bz2' ,fileobj=archiveFile) as tar:
    	tar.add(contentRepPath, arcname=os.path.sep);
    L'archive qui est créé ne prend toujours pas en compte le nom du tar 'MonNomAMoi'. Au final j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xyz.tar.bz2 
             -xyz.tar
                  -SubRep_A
                  -SubRep_B
                  -SubRep_C
    Y'a-t'il une erreur dans mon code, où je m'étais mal exprimé ?
    D'avance merci.
    Pourquoi utiliser mode='x;bz2' ? J'aurais mis intuitivement mode='w;bz2' moi ...
    Pourquoi faire 2 open ? Dans un premier temps je vous conseillerais de réaliser simplement un .tar avec les conditions que vous voulez. La compression bz2 devrait ensuite se faire via passage d'un simple argument optionnel. Une lecture de la documentation du package tarfile s'impose pour vous.

  15. #15
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Moi ce que je ne comprends pas, c'est l"intérêt d'avoir un nom de tar différent du bz2, est-ce que c'est pour avoir un nom de répertoire défini à l'extraction ?

    Car si c'est simplement ça, alors.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    archiveNamePath = 'E:/tmp/xyz.tar.bz2'
    contentRepPath = 'E:/data/content'
     
    with tarfile.open(archiveNamePath, 'W:bz2') as tar:
        tar.add(contentRepPath, arcname='pif')
        tar.add(contentRepPath, arcname='pif/paf')
        tar.add(contentRepPath, arcname='pif/plaf/pouf')

Discussions similaires

  1. Réponses: 11
    Dernier message: 25/04/2006, 09h33
  2. Batch et répertoire avec accent
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/10/2005, 10h31
  3. Batch : copy d'un répertoire avec des espaces
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 26/10/2005, 12h47
  4. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  5. Protection d'un répertoire avec .htaccess
    Par Bweb dans le forum Apache
    Réponses: 2
    Dernier message: 04/05/2004, 18h12

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