Partage
  • Partager sur Facebook
  • Partager sur Twitter

converti tuple en str

pour de vrai

Sujet résolu
7 août 2015 à 15:23:30

Bonjour, voila mon problème, j'ai un tuple en python et j'aimerais le convertir en une chaîne de caractère.

Sur internet beaucoup de personne recommande d'utiliser la fonction .join(), mais j'ai l'impression que cette fonction ne me donne pas un string mais un tuple unifié ?

tup=''.join(tup)



Par avance merci pour vos explication.

-
Edité par slitaz 7 août 2015 à 15:24:27

  • Partager sur Facebook
  • Partager sur Twitter
7 août 2015 à 15:26:39

Salut,

Tu pourrai donner un exemple du tuple que tu cherches à convertir. Également le code que tu as testé, le résultat obtenu et le résultat attendu.

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
7 août 2015 à 15:35:55

C'est un peu compliqué, le tuple est généré en récuperant du texte dans un fichier binaire:

with open(monfichier, "rb") as f:
   data= struct.unpack('40s', f.read(40))
   self.text=data


Le tuple est généré comme ceci, mais moi je voudrais un string, sa me sort des trucs comme sa:

(b'Mon texte \x00\x00\x00\x00',)



-
Edité par slitaz 7 août 2015 à 15:39:06

  • Partager sur Facebook
  • Partager sur Twitter
7 août 2015 à 17:39:11

Pourrais-tu expliquer pourquoi tu récupères 40 octets d'un fichier et que tu essaies de les convertir en texte au lieu de simplement ouvrir le fichier en mode texte et de lire les 40 premiers caractères?

Sinon pour transformer un objet bytes (le b'Mon texte \x00\x00\x00\x00') de ton exemple en chaîne de caractères, il suffit de le décoder avec le codec de ton choix. C'est quoi décoder? C'est lui dire quel est l'équivalent entre la valeur d'un (ou plusieurs) octet et la représentation d'un caractère. Regarde ces exemples:

>>> b = b'a'
>>> print(b)
b'a'
>>> import binascii
>>> binascii.hexlify(b)
b'61'
>>> ord('a')
97
>>> 0x61 # Donc le caractère a est représenté par un octet avec la valeur 97 (0x61 en hexadécimal)
97
>>> b.decode()
'a'
>>> b'salut'.decode()
'salut'
>>> 'é'.encode()
b'\xc3\xa9'
>>> b'H\xc3\xa9'.decode()
'Hé'
>>> b'H\xc3\xa9'.decode(encoding='latin-1')
'Hé'
Comme tu peux le voir en bas, en UTF-8 on représente le caractère é sur 2 octets: 0xC3 0xA9. Mais en latin-1 ces deux octets représentent autre chose, à savoir 2 caractères: é.

La raison pour laquelle la représentation des bytes en Python te donne souvent des lettres est parce que tous les encodages ont en commun l'encodage ASCII (pour des valeurs de 0 à 127). Mais au-delà ça dépend du sens qu'on veut donner.

-
Edité par Dan737 7 août 2015 à 17:41:36

  • Partager sur Facebook
  • Partager sur Twitter
7 août 2015 à 20:31:51

Je ne connais pas l'encodage de ces fichiers binaire, mais je ne vois pas le rapport avec mon problème ? j'arrive bien a récupérer mes données (le fichier binaire ne contient pas que 40 octets de texte), je veut juste convertir mon tuple en string.
  • Partager sur Facebook
  • Partager sur Twitter
7 août 2015 à 20:50:51

Si tu ne vois pas le problème c'est que tu ne comprends pas ce qu'est un encodage, et comment sont sauvegardés les fichiers "texte". Quand tu écris dans un fichier texte abc, en réalité, au niveau des octets, il y a 3 octets représentant les 3 lettres. La valeur de ces octets est donnée par l'encodage ASCII. Donc quand tu lis le fichier en binaire, tu vas recevoir 3 octets. Pour les transformer en une chaîne de caractère, tu vas devoir les décoder selon l'encodage ASCII. Ainsi il va trouver que le premier octet qui vaut 0x61 ou encore en binaire 0b1100001 est en fait un a. Et ainsi de suite.

Tout va bien pour les caractères ASCII. Mais au-delà, il faut savoir comment interpréter les valeurs au-dessus de 0x7F. Et ça, ça varie selon l'encodage.

Comme je te l'ai montré plus haut, tu peux décoder un objet bytes avec sa méthode decode, et ça te retourne un objet str. C'est ce que tu veux il me semble... Sans arguments, decode utilisera l'encodage UTF-8. A toi de voir si ce qui sort à du sens...

Donc par exemple

mon_tuple = (b'Mon texte \x00\x00\x00\x00',)
ma_chaine = mon_tuple[0].decode()
print(ma_chaine)
print(type(ma_chaine))

-
Edité par Dan737 7 août 2015 à 20:51:07

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
8 août 2015 à 21:31:24

>>> mon_tuple = (b'Mon texte \x00\x00\x00\x00',)
>>> mon_tuple[0].strip(b'\0')
b'Mon texte '
  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 9:38:21

Mon but est d'ajouter ce tuple a un string, 

machaine="toto"

chainetotel=machaine+mon_tuple[0].strip(b'\0')

Mais j'ai l'erreur:

TypeError: Can't convert 'bytes' object to str implicitly

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 août 2015 à 9:41:03

machaine doit être du type bytes

machaine = b'toto'

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 9:43:40

Y'aurais pas moyen de faire l'inverse, c'est a dire de transformer le tuple en str non byte
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 août 2015 à 10:26:31

chainetotel = machaine + str(mon_tuple[0].strip(b'\0'))
  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 10:48:50

Je me suis mal exprimer, je voudrais enlever les b'' qu'il y'a autour de la chaîne de caractère.

Je pourrais les supprimer manuellement style:

del machaine[0]

Mais je cherche une méthode plus intelligente, en interagissement dans la phase ou tu transforme le tuple en str:

str(mon_tuple[0].strip(b'\0'))

A moins que se soit impossible, et qu'il ne faille le faire manuellement ?

-
Edité par slitaz 10 août 2015 à 10:49:08

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 août 2015 à 11:35:59

Dans ton tuple tu as un ensemble de chaînes de caractères de type bytes...

Pour transformer toutes tes chaînes de caractères de cet ensemble en type string, il n'y a pas d'autre choix que d'utiliser la fonction str...

Pour enlever les b'...' il faut juste utiliser print.

Sinon autre choix

>>> mon_tuple = (b'Mon texte \x00\x00\x00\x00',)
>>> list(map(str, (c.strip(b'\0').decode() for c in mon_tuple)))
['Mon texte ']

EDIT:

Après test effectivement, ces lignes sont correctes

>>> mon_tuple = (b'Mon texte \x00\x00\x00\x00',)
>>> bytes_to_str = lambda s: (s.strip(b'\0')).decode()
>>> list(map(bytes_to_str, mon_tuple))
['Mon texte ']




-
Edité par Anonyme 10 août 2015 à 14:16:43

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 13:02:42

C'est pas str qu'il faut utiliser mais la méthode decode! Je me tue à l'expliquer depuis le début de ce thread. :s

mon_tuple = (b'Mon texte \x00\x00\x00\x00',)
message = mon_tuple[0].strip(b'\0').decode()
print(message)
Une byte c'est un octet en français. C'est à dire 8 bits. Ni plus, ni moins. Ca ne représente que ce que tu veux que ça représente. Ca peut représenter un nombre, une lettre, n'importe quoi.

Regarde ceci:

des_octets = b'abcd'
print("Des octets: ", des_octets)
print("Représentation en décimal, hexadecimal et binaire de ces octets.")
print("Décimal\tHexa\tbinaire")
for octet in des_octets:
print("{0}\t\t{0:X}\t\t{0:b}".format(octet))

print() print("On décode ces octets selon la norme UTF-8. Vu que chaque valeur est inférieure à 127, on est dans le code ASCII.") chaine_de_caracteres = des_octets.decode('utf-8') for caractere in chaine_de_caracteres:

print(caractere)
</pre>

Et si possible, au lieu d'ignorer mes messages, je préférerais que tu poses des questions si quelque chose t'échappe. ;)

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 13:38:11

oldProgrammer a écrit:

Pour transformer toutes tes chaînes de caractères de cet ensemble en type string, il n'y a pas d'autre choix que d'utiliser la fonction str...

Pour enlever les b'...' il faut juste utiliser print.

Tu as pris le temps d'essayer avant de dire ça ?

>>> str(b'toto')
"b'toto'"
>>> print(str(b'toto'))
b'toto'

Si tu as fait tes tests en Python2, le type bytes n'existant pas à proprement parler, il est normal que tu aies eu un comportement différent.

la solution est évidemment d'utiliser decode.

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 15:20:16

ok ,merci pour vos réponses.
  • Partager sur Facebook
  • Partager sur Twitter
26 novembre 2019 à 15:44:06

Bonjour,  j'ai un tuple en python que j'aimerais convertir en une chaîne de caractère.

voici mon tuple : [('M', 4), ('a', 3), ('c', 1), ('X', 1), ('o', 1), ('l', 2), ('o', 1), ('M', 2)].

je voudrais comme résultat la chaîne : MMMMaaacXolloMM
  • Partager sur Facebook
  • Partager sur Twitter
26 novembre 2019 à 15:51:31

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter