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.