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 :

Lecture fichier binaire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut Lecture fichier binaire
    Bonjour,
    je recupere un fichier binaire specifie avec un entete de 11 octets et un bloc de données compressées en gz.
    Je souhaite recuperer les donnees.
    j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    file = open('tuile', "rb")
    num=(file.read())
    Pour l'instant j'ai les donnees binaires du genre b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x0....
    comment continuer
    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    C'est quoi concrètement la suite des événements ? Vous avez votre chaîne, mais vous devez en faire quoi après ?

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par flyingfr Voir le message
    je recupere un fichier binaire specifie avec un entete de 11 octets et un bloc de données compressées en gz.
    Je souhaite recuperer les donnees.
    Pour l'instant j'ai les donnees binaires du genre b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x0....
    comment continuer
    Ben... supprimer les 11 premiers octets de la chaine puis utiliser la librairie gzip pour dézipper le reste...

    Citation Envoyé par flyingfr Voir le message
    num=(file.read())
    Tu aimes bien les parethèses inutiles toi hein? Oui, moi aussi quand je veux écrire v=truc j'écris v=(truc), je me sens plus rassuré ainsi (sait-on jamais...)
    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]

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par flyingfr Voir le message
    Avec le nom de la variable, j'ai un doute. Le but est de récupérer "num" les 11 premiers caractères ou bien les ignorer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    num = f.read(11) # puis convertir en int ?
    gz = f.read()
    ou ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f.seek(12)
    gz = f.read()

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut
    En fait je veux lire les 11 premiers octets et lire la suite apres l avoir decompressée

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par flyingfr Voir le message
    En fait je veux lire les 11 premiers octets et lire la suite apres l avoir decompressée
    Vous avez des utilitaires tout faits pour çà ou même la bibliothèque gzip de Python.
    Après, si vous voulez écrire le code qui décompresse un fichier gzip, bon courage (mais vous pourriez commencer par plus simple histoire de vous familiariser avec la programmation, Python, les structures de données que vous allez devoir utiliser,...)

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

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut
    en fait mon fichier c'est un fichier binaire de carto avec des 1 et des zeros entete 11 octets corps compressé en gz
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    url='https://static.virtualregatta.com/ressources/maps/dalles/vro2k16/1/0/4/1_-4_44.deg'
    nom_fichier='tuile' 
    urlretrieve(url, nom_fichier)  # recuperation des fichiers
    print('tuile chargée!')
     
    with open('tuile', 'rb') as file:
        num  =file.read()
    je peux effectivement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        num1=num[0:11]
        num2=num[11:]
    mais je n'arrive ni a lire num1 ni a decompresser et lire num2

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    La seule chose que tu montres ici, c'est que tu n'as rien fait

    je n'arrive ni a lire num1
    Du chinois ! tu fais un print et tu as ou non un résultat, après pour l'interpréter pour tes besoins cela dépend uniquement du format de ton fichier, il y a peut-être une conversion à faire, pas trop difficile de tester et encore moins à coder.

    ni a decompresser et lire num2
    pas de code, donc impossible de donner un avis (peut-être la ligne 10 de ton 3ème test ?), bien sûr tu as testé la librairie ... @Sve@r t'a donné le lien, ensuite tu ne vas pas me faire croire que tu ne peux pas lire la doc pour écrire une petite ligne de code

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flyingfr Voir le message
    en fait mon fichier c'est un fichier binaire de carto avec des 1 et des zeros entete 11 octets corps compressé en gz
    Oui, tu l'as déjà dit. On a tous bien compris l'idée.

    Citation Envoyé par flyingfr Voir le message
    je peux effectivement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        num1=num[0:11]
        num2=num[11:]
    C'est en effet une idée. Personnellement moi j'ai fait num1=file.read(11) et num2=file.read() déjà montrée par papajoker donc au lieu de dire "je peux" tu aurais dû dire "je dois"...

    Citation Envoyé par flyingfr Voir le message
    mais je n'arrive ni a lire num1 ni a decompresser et lire num2
    Et t'es allé voir la librairie gzip dont j'ai déjà parlé? Ceci dit comme moi non plus je n'ai pas réussi (parce que justement ladite librairie me dit que num2 n'est pas compressé), je me dis que peut-être ton information "11 octets + reste compressé" est légèrement erronée...
    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]

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par flyingfr Voir le message
    mais je n'arrive ni a lire num1
    Pour avoir fait le test, moi j'y arrive bien, suffit de faire un print(num1)

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Effectivement ne semble pas être du gz, pas trouvé l'entête dans le fichier, et pas bon si je rajoute l'entête b'\x1f\x8b\x08' à num2

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Sûr du sens des démarches à faire ?

    Pour avoir les 11 premiers éléments, vous pouvez utiliser la méthode de @papajoker

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je n'arrive pas non plus a decoder l 'entete qui doit etre ça : b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x03\x1a\xec'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> s = b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x03\x1a\xec'
    >>> decimals = [i for i in s]
    >>> decimals
    [1, 1, 4, 0, 44, 1, 2, 218, 225, 3, 26, 236]
    C'est ça que tu veux ?

  14. #14
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut
    Merci,
    pour le decodage de cette partie
    c'est parfait !

  15. #15
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    octets 4 et 5: longitude de la tuile, le premier octet indique le signe, 1 pour négatif, 0
    pour positif, le second contient la valeur absolue de la longitude

    octet 7 et 8: largeur (et hauteur) de la tuile en nombre de valeurs, ce champ vaut
    toujours 730, il y a 730x730 soit 532900 valeurs dans les données
    cela n'a pas de sens !
    un octet c'est de 0 à 254, comment faire tenir une longitude ??? ce ne sont pas plutot des entiers comme unité (8 ou 16 ???)

    "année = 2040 - octet9" , cette tuille à été faite en 2040-225, 1815 ou alors c'est une très vielle carte ?

    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
    entetes ={
            'v':1,
            'lat':2,
            'long':2,
            'none':1,
            'size':2,
            'an':1,
            'mois':1,
            'jour':1,
        }
     
        for k in entetes:
            x = file.read(entetes[k])
            entetes[k] = int.from_bytes(x, byteorder='big', signed=True) # signed ?
        print(entetes)
     
    {'v': 1, 'lat': 260, 'long': 44, 'none': 1, 'size': 730, 'an': 225, 'mois': 3, 'jour': 26}
     
    # ou:
    x = b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x03\x1a\xec'
    print('an:', x[8])
    print('lat', x[1:3], int.from_bytes(x[1:3], byteorder='big', signed=True))
    ok, avec ce premier test, la taille est de 730

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par flyingfr Voir le message
    Merci,
    pour le decodage de cette partie
    c'est parfait !
    b'\x01\x01\x04\x00,\x01\x02\xda\xe1\x03\x1a\xec' ou [1, 1, 4, 0, 44, 1, 2, 218, 225, 3, 26, 236] sont les mêmes suites d'octets, c'est juste l'affichage qui change: rien n'a été décodé, c'est juste une représentation différente.

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

  17. #17
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut
    Papajoker,
    Pour les latitudes et longitudes c'est normal que ce soit des entiers, ce sont les references de tuiles de cartographie au pas de 1° le maximum est 180 en longitude 90 en latitude.
    sur ce fichier en particulier ca doit etre la longitude -4 latitude 44

  18. #18
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2015
    Messages : 35
    Par défaut
    Bonjour,
    en fait la solution etait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    import numpy as np
    import zlib
     
    with open(filename,'rb') as fid:
        header=fid.read(11)
        gzbuf=fid.read()
        databuf=zlib.decompress(gzbuf,-zlib.MAX_WBITS)
        databuf=zlib.decompress(gzbuf,0-zlib.MAX_WBITS)
     
    data=np.frombuffer(databuf,dtype=np.int8)
    data.resize((730,730))

    Merci a ceux qui ont participé,
    Je marque en résolu.

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

Discussions similaires

  1. Lecture fichier binaire et inversion d'octets
    Par zoro_le_renard dans le forum Fortran
    Réponses: 8
    Dernier message: 17/07/2007, 20h35
  2. Lecture fichier binaire
    Par djidji dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2006, 11h58
  3. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  4. Lecture fichier binaire
    Par kek_net dans le forum Langage
    Réponses: 5
    Dernier message: 07/08/2006, 19h37
  5. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53

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