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 :

[zlib] Question de débutant


Sujet :

Python

  1. #1
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 455
    Points
    455
    Par défaut [zlib] Question de débutant
    Je débute en python et je cherche à décompressé des fichiers '.Z', je me casse malheureusement les dent sur l'utilisation de zlib.

    J'ai écris ce bout de code qui compresse et décompresse un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import zlib
     
    #testContent est un banal fichier text
    with open('testContent', 'r') as f:
        file_content = f.read()
        compress = zlib.compress(file_content)
        with open('testPy.Z', 'wb') as fZ:
            fZ.write(compress)
     
    with open('testPy.Z', 'rb') as f:
        file_content = f.read()
        decompressed_content = zlib.decompress(file_content)
        print decompressed_content
    Mais le fichier .Z produit est mal formé : impossible à décompressé en ligne de commande avec 'uncompress.real testPy.Z' => 'testPy.Z: not in compressed format'

    Deplus si je tente de décompresse un fichier crée grâce à 'compress -v testContent' avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with open('testContent.Z', 'rb') as f: # Notice that I open this in binary mode
        file_content = f.read() # Read the compressed binary data
        decompressed_content = zlib.decompress(file_content) # Decompress
        print decompressed_content
    l'exception suivante est levée :
    "zlib.error: Error -3 while decompressing data: incorrect header check"

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Andarus Voir le message
    Je débute en python et je cherche à décompressé des fichiers '.Z', je me casse malheureusement les dent sur l'utilisation de zlib.
    Le format des fichiers .Z est celui des "archive" unix alors que zlib est .z ou .gz et s'utilise avec gzip.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 455
    Points
    455
    Par défaut
    Merci, après quelques recherches je n'ai pas trouvé de lib python me permettant de décompressé ces fichiers .Z...

    j'ai vue que le format .Z utilisait l'algorithme de compression https://fr.wikipedia.org/wiki/Lempel-Ziv-Welch.
    J'ai trouvé un exemple implémentation python de cet algo sur http://rosettacode.org/wiki/LZW_compression#Python.

    Mais je n'est pas trouvé d'information sur le format interne de ces fichiers .Z(si quelqu'un connait au autre nom que .Z) header, dictionnaire de départ...
    Si quelqu'un possède de plus ample information, Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Le format des fichiers .Z est celui des "archive" unix alors que zlib est .z ou .gz et s'utilise avec gzip.
    Bonjour

    Je ne comprends pas trop bien. Le code de départ proposé par Andarus fonctionne bien. J'ai un petit fichier texte, il le compresse dans un fichier intermédiaire plus petit que le fichier texte, puis décompresse ce fichier intermédiaire dans une variable qu'il m'affiche et la variable en question contient bien le fichier d'origine.
    Toutefois le fait que le fichier soit d'extension ".z" ou ".Z" importe peu ; c'est son contenu qui compte. Je peux très bien compresser (via gzip) un toto dans un toto.xls (pourquoi pas) puis faire un "zcat" de toto.xls et j'aurai alors le contenu de toto. Or la doc de zlib mentionne bien que cette librairie est compatible gzip.
    Mais chez-moi non plus je n'arrive pas à appliquer "zcat" ou "gunzip" sur le fichier intermédiaire.

    Bref pour moi le problème ne vient pas de l'extension qu'on donne au fichier intermédiaire (surtout sous Linux qui ne se préoccupe absolument pas des extensions) mais soit de la réalité de la compatibilité zlib/gzip ; soit de la façon dont le code utilise cette librairie (peut-être qu'il faut spécifier une option en plus ou autre)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Andarus Voir le message
    Mais je n'est pas trouvé d'information sur le format interne de ces fichiers .Z(si quelqu'un connait au autre nom que .Z) header, dictionnaire de départ...
    Pour la petite histoire, voir ici.
    Avec zlib, vous devriez donc lire et décompresser mais pas écrire (et compresser) de fichier .Z.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 455
    Points
    455
    Par défaut
    Effectivement gzip console décompresse mais pas le module gzip de python:



    Désolé j'ai un peu l'impression de tourné en rond...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Andarus Voir le message
    Désolé j'ai un peu l'impression de tourné en rond...
    Certes mais vous voulez aller où?

    Le format des fichiers .Z est peut être toujours protégé par des brevets.
    S'il ne l'est plus, vous avez des solutions de compressions open-source bien meilleures qui ont été publiées. Pourquoi vous prendre le chou avec ce format là?

    En tous cas, si votre but est d'avoir une API permettant de... à partir de Python, vous disposez des commandes compress et uncompress. Rien ne vous empêche de lancer un sous-process avec les paramètres qui vont bien pour faire tout ou partie de ce que ne fait pas zlib. Ca ne sera pas plus compliqué à programmer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 455
    Points
    455
    Par défaut
    Je ne m’intéresse pas à ce format de compression par amour de l'archéologie informatique, mais car je récupère des données dans ce format.

    Je voyais deux avantages à tous faire en python:
    • Eviter deux écritures disque les données devant être au final stocker en base.
    • Mais surtout ne pas devenir Plateforme dépendant ne connaissant pas encore la configuration du serveur ou la solution sera déployé.


    Merci pour votre aide en tout cas cela m'a permis d'y voir plus claire.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Andarus Voir le message
    Je ne m’intéresse pas à ce format de compression par amour de l'archéologie informatique, mais car je récupère des données dans ce format.

    Je voyais deux avantages à tous faire en python:
    • Eviter deux écritures disque les données devant être au final stocker en base.
    • Mais surtout ne pas devenir Plateforme dépendant ne connaissant pas encore la configuration du serveur ou la solution sera déployé.

    Vous êtes dépendant de "gzip". Mais il a été porté sur la plupart des environnements.
    (par contre, Python n'est pas toujours installé par défaut, ou à la "bonne" version)
    Rediriger la sortie de gzip vers un pipe et en stocker le contenu en mémoire se fait aussi en Python.
    note: vous pouvez aussi regarder sur PyPI s'il n'existe pas un module externe qui permettrait de faire "mieux".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Points : 455
    Points
    455
    Par défaut
    Voilà la solution solution à laquelle je suis arrivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import subprocess
     
    with open('test.Z', 'rb') as f:
        file_content = f.read()
     
    result = subprocess.check_output(['gzip', '-cd'], input = file_content)
     
    print(result.decode('utf-8'))
    Merci à tout ceux qui ont pris sur leur temps pour me répondre.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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