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 :

convertir un mix de byte + string


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 23
    Par défaut convertir un mix de byte + string
    Bonjour à tous,

    Je desire obtenir un format str a partir d'un format byte.
    J'ai un programme qui fonctionne en Python 2 mais pas en Python 3.
    En Python 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def binaryMethod(files, lenI):
    outList = [] 
    for _ in range(lenI):
                # read the length of the next string (read only the first 4 bytes) 
                blen = int(ceil(float(unpack('>I', files.read(4))[0]) / 4) * 4)
                # store the  string into outList
                outList.append(str(unpack('%ds' % blen, files.read(blen))[0]).replace("\x00", ""))
    print (outList)
    RT
    RT
    ts
    MI
    VI
    MO
    VO
    EM
    EE
    Mt
    ce qui est exactement ce que je veux
    lenI est un entier, files est un fichier en format binaire.
    En Python 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def binaryMethod(files, lenI):
    outList = [] 
    for _ in range(lenI):
                # read the length of the next string (read only the first 4 bytes) 
                blen = int(ceil(float(unpack('>I', files.read(4))[0]) / 4) * 4)
                # store the  string into outList
                outList.append(str(unpack('%ds' % blen, files.read(blen))[0]).replace("\x00", ""))
    print (outList)
    b'RT\x00\x00'
    b'RT\x00\x00'
    b'ts\x00\x00'
    b'MI\x00\x00'
    b'VI\x00\x00'
    b'MO\x00\x00'
    b'VO\x00\x00'
    b'EM\x00\x00'
    b'EE\x00\x00'
    b'Mt\x00\x00'
    j'ai essayé la chose suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test = outList[0].decode('utf8')
    AttributeError: 'str' object has no attribute 'decode'
    Auriez-vous une idée?

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    Hello,
    Sauf erreur de ma part, car il se fait tard :
    En python3, la gestion de l'unicode change, il est géré de façon native. Plus besoin de déclarer un encodage dans le source, et plus besoin de s'enquiquiner avec des conversions de charset.
    Par contre, il y a un tas de petites choses qui changent.
    Notamment, quand un fichier est ouvert en texte, on récupère des chaînes. Quand il est ouvert en binaire, on récupère des bytes.
    Également, les chaînes n'ont plus de méthode decode. C'est inutile, tout est en unicode, et toutes les chaînes sont compatibles entre elles. Par contre, les bytes n'ont pas de notion de charset, puisqu'ils contiennent du binaire et pas une chaîne (au final, c'est toujours, des données identiques, mais pas gérées de la même façon). Et donc, les bytes ont une méthode decode qui permet de les convertir en chaîne.
    Concrètement, ton programme plante sans doute parce que outList[0] est déjà une chaîne. Par ailleurs, si tu veux du texte quand tu lis ton fichier, il suffit de l'ouvrir en texte, et pis c'est tout.
    Au départ, c'est déconcertant, mais une fois qu'on est habitué, c'est top moumoute...
    Pas sûr d'avoir été bien clair...
    PS : sur ce coup-là, python3 n'est pas compatible avec p2. Et toc.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 23
    Par défaut
    Merci de la réponse.
    Disons que je ne cherche pas spécialement à lire tout le texte.
    J'ai isolé un bloc du fichier binaire. Voici par exemple les 10 premieres lignes du bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i,line in enumerate(f):
              if i< 10:
                print (line)
    b'TrDhDM1s10\x00\x00\x00\x00\x00\x06kv1s10\x00\x00\x00\x00\x00\x06kl1s10\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s11\x00\x00\x00\x00\x00\x06kv1s11\x00\x00\x00\x00\x00\x06kl1s11\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s12\x00\x00\x00\x00\x00\x06kv1s12\x00\x00\x00\x00\x00\x06kl1s12\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s13\x00\x00\x00\x00\x00\x06kv1s13\x00\x00\x00\x00\x00\x06kl1s13\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s14\x00\x00\x00\x00\x00\x06kv1s14\x00\x00\x00\x00\x00\x06kl1s14\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s15\x00\x00\x00\x00\x00\x06kv1s15\x00\x00\x00\x00\x00\x06kl1s15\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s16\x00\x00\x00\x00\x00\x06kv1s16\x00\x00\x00\x00\x00\x06kl1s16\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s17\x00\x00\x00\x00\x00\x06kv1s17\x00\x00\x00\x00\x00\x06kl1s17\x00\x00\x00\x00\x00\x06
    b'TrDhDM1s18\x00\x00\x00\x00\x00\x06kv1s18\x00\x00\x00\x00\x00\x06kl1s18\x00\x00\x00\x00\x00\x06
    J'aimerai mettre les éléments en gras dans une liste.


    Je crois que ta réponse m'a menée sur la bonne voie: je pense que peux chercher par caractère en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i,line in enumerate(f):
              if i< 10:
                if re.search(rb'TrDhDM1s11',line):
                  print (True)
    True
    C'est pas du top niveau (Pythonic, comme on dit dans le milieu ), mais je crois que je vais créer une regex qui ignore les \x00 pour filtrer mes noms de variables (TrDhDM1s11 etc...)

    merci pour ton aide, je posterai une solution permanente quand celà fonctionne.

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Un simple replace à la place des regex, ce sera plus facile.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    C'est ici que çà se passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        outList.append(str(unpack('%ds' % blen, files.read(blen))[0]).replace("\x00", ""))
    car avec Python3 transformer des bytes en str sans préciser l'encoding produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b = b'1234'
    >>> str(b)
    "b'1234'"
    alors qu'en le précisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> str(b, 'ascii')
    '1234'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    Citation Envoyé par pascaloupsu Voir le message
    C'est pas du top niveau (Pythonic, comme on dit dans le milieu ), mais je crois que je vais créer une regex qui ignore les \x00 pour filtrer mes noms de variables (TrDhDM1s11 etc...)
    Hello,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x.split(b'\x00')[0] for x in line.split(b'\x06')]
    est assez pythonesque, mais peut-être pas encore tout-à-fait ce que tu cherches...

Discussions similaires

  1. [Débutant] Convertir un tableau de byte en string
    Par bipbip2006 dans le forum C#
    Réponses: 4
    Dernier message: 04/07/2011, 22h41
  2. [2.0] Convertir une cle primaire byte[] en string
    Par freddyboy dans le forum Accès aux données
    Réponses: 14
    Dernier message: 20/12/2010, 12h05
  3. convertir un type (int ou string) en n bytes
    Par Rayann dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 18/12/2009, 10h19
  4. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 19h20
  5. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52

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