Come posso convertire una variabile stringa di 3 byte Python in una stringa normale?


116

Ho letto un allegato di posta elettronica XML con

bytes_string=part.get_payload(decode=False)

Il payload arriva come una stringa di byte, come suggerisce il nome della mia variabile.

Sto cercando di utilizzare l'approccio consigliato Python 3 per trasformare questa stringa in una stringa utilizzabile che posso manipolare.

L'esempio mostra:

str(b'abc','utf-8')

Come posso applicare l' bargomento della parola chiave (byte) alla mia variabile bytes_stringe utilizzare l'approccio consigliato?

Il modo in cui ho provato non funziona:

str(bbytes_string, 'utf-8')

Risposte:


210

Hai avuto quasi ragione nell'ultima riga. Tu vuoi

str(bytes_string, 'utf-8')

perché il tipo di bytes_stringè bytes, lo stesso del tipo di b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')Gli errori possono essere ignorati passando il terzo parametro.
Shubhamoy

2
Sembra che dovrebbe essere un commento alla risposta di pylang (che affronta la gestione di input non validi). Se (lo credi) non c'è niente di sbagliato bytes_string, perché dovresti ignorare gli errori?
Toby Speight

3
Sto ottenendo seguente errore con il vostro approccio: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteper la seguente stringa di byte b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
Alper

Bene @alper, non è una stringa UTF-8 valida, quindi cosa ti aspettavi?
Toby Speight

Grazie per la soluzione
Ajay Kumar

49

Chiamata decode()su bytesun'istanza per ottenere il testo che codifica.

str = bytes.decode()

5
UnicodeDecodeError: il codec "utf-8" non può decodificare il byte 0xf6 nella posizione 230: byte iniziale non valido
Juha Untinen

3
@JuhaUntinen la tua codifica probabilmente non è utf-8.
tommy.carstensen

4
Come filtrare (saltare) i caratteri non UTF8 dall'array?
Dr. Failov

9

AGGIORNAMENTO:

NON AVERE ALCUNA be citazioni all'inizio e alla fine

Come convertire bytescome visto in stringhe, anche in situazioni strane.

Poiché il tuo codice potrebbe contenere caratteri irriconoscibili per la 'utf-8'codifica, è meglio usare solo str senza parametri aggiuntivi:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

se aggiungi un 'utf-8'parametro, a questi byte specifici, dovresti ricevere un errore.

Come dice lo standard PYTHON 3, ora textsarebbe in utf-8 senza preoccupazioni.


il risultato è "b '\\ x02 - \\ xdfI #)'" che probabilmente non è quello che vuole
Glen Thompson

@GlenThompson è solo un esempio di condizioni indesiderate che possono verificarsi. Uso intenzionalmente questo testo specifico. Se intendi che il testo ha una bprima di esso, allora ho aggiornato la risposta
Seyfi

quindi molto grazie sto cercando un modo per rimuovere la b '' di una stringa che ha carattere ansi senza codificare e perdere i caratteri, sono nuovo in python e non so di poter ridurre un array dall'inizio e inizio a usare gli indici: O
Diego Fernando Murillo Valenci

@DiegoFernandoMurilloValenci, il tuo benvenuto. Sono contento di poterti aiutare.
Seyfi

6

Come filtrare (saltare) i caratteri non UTF8 dall'array?

Per affrontare questo commento nel post di @ uname01 e nell'OP, ignora gli errori:

Codice

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

Dettagli

Dai documenti , ecco altri esempi che utilizzano lo stesso errorsparametro:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

L'argomento degli errori specifica la risposta quando la stringa di input non può essere convertita secondo le regole di codifica. I valori legali per questo argomento sono 'strict'(solleva UnicodeDecodeErrorun'eccezione), 'replace'(usa U+FFFD, REPLACEMENT CHARACTER) o 'ignore'(lascia semplicemente il carattere fuori dal risultato Unicode).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.