Vai al contenuto principale

Come convertire byte in stringa in Python

Per convertire byte in stringhe in Python, possiamo usare il metodo .decode(), specificando la codifica appropriata.
· 8 min leggi

Scopri con l'IA

Una delle sequenze built-in meno conosciute in Python è bytes, una sequenza immutabile di interi. Ogni intero rappresenta un byte di dati. I dati vengono spesso trasmessi su reti e tra programmi come byte. I byte non sono leggibili dall'uomo e spesso dobbiamo convertirli in stringhe nei nostri programmi Python.

Questo tutorial esplora le tecniche per convertire byte in stringhe in Python. Se ti interessa l'operazione inversa, dai un'occhiata al mio tutorial su come convertire stringhe in byte in Python.

Cominciamo con una risposta breve per chi va di fretta.

Risposta breve: come convertire byte in stringa in Python

Lo strumento principale per convertire byte in stringhe in Python è il metodo .decode():

data = b"\xc3\xa9clair"
text = data.decode(encoding="utf-8")
print(text)
éclair

Il metodo .decode() restituisce una stringa che rappresenta l'oggetto bytes. In questo esempio si usa la decodifica UTF-8. UTF-8 è la codifica predefinita, quindi non è necessaria nell'esempio sopra, ma possiamo usare anche altre codifiche.

Capire byte e stringhe in Python

Python ha una struttura dati built-in bytes, che è una sequenza immutabile di interi nel range 0–255. Un intero all'interno di questo intervallo di 256 numeri può essere rappresentato usando otto bit di dati, equivalenti a un byte. Pertanto, ciascun elemento in un oggetto bytes è un intero che rappresenta un byte.

Usiamo il costruttore bytes() per creare un oggetto bytes da una lista:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(type(data))
<class 'bytes'>

Questa sequenza di interi è immutabile:

data[0] = 100
Traceback (most recent call last):
 ...
   data[0] = 100
   ~~~~^^^
TypeError: 'bytes' object does not support item assignment

Python genera un TypeError quando proviamo a cambiare un valore all'interno di questa sequenza. Confermiamo che un oggetto bytes può contenere solo interi nell'intervallo da 0 a 255:

data = bytes([254, 255, 256])
Traceback (most recent call last):
 ...
   data = bytes([254, 255, 256])
          ^^^^^^^^^^^^^^^^^^^^^^
ValueError: bytes must be in range(0, 256)

Il ValueError indica che un intero che rappresenta un byte deve appartenere a range(0, 256). La fine dell'intervallo è esclusa, come da convenzione per gli intervalli numerici in Python.

Possiamo visualizzare l'oggetto bytes usando print():

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data)
b'DataCamp'

La rappresentazione mostra l'oggetto bytes tramite caratteri. Python visualizza gli interi usando i caratteri ASCII corrispondenti a quei valori. Il prefisso b davanti ai caratteri tra virgolette indica che si tratta di un oggetto bytes.

Possiamo anche creare un oggetto bytes usando direttamente il letterale bytes:

data = b"DataCamp"
print(data)
print(data[0])
b'DataCamp'
68

L'oggetto è visualizzato tramite caratteri, ma i suoi elementi sono interi.

Tuttavia, gli oggetti bytes sono leggibili dall'uomo solo quando si usano interi corrispondenti a caratteri ASCII stampabili. Poiché l'ASCII è una codifica a 7 bit, contiene 128 codici, ma solo 95 di questi caratteri ASCII sono stampabili.

Gli interi tra 0 e 127 che non hanno un carattere ASCII stampabile e gli interi tra 128 e 255 sono mostrati come numeri esadecimali:

data = bytes([0, 68, 97, 116, 97, 67, 97, 109, 112, 200])
print(data)
b'\x00DataCamp\xc8'

Il primo intero nella lista è ora 0, che non è un carattere stampabile in ASCII. L'oggetto bytes mostra questo intero come \x00, la rappresentazione esadecimale di 0. L'ultimo intero è 200, che è fuori dal range ASCII ma all'interno dell'intervallo di interi utilizzabili nei byte. Python visualizza questo intero come \xc8, ovvero 200 in esadecimale.

Le strutture dati bytes e stringhe condividono caratteristiche comuni. Entrambe sono sequenze immutabili, ma bytes contiene interi, mentre le stringhe contengono caratteri:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data[0])

​text = "DataCamp"
print(text[0])
68
D

I byte vengono usati per trasferire dati su reti e tra diverse interfacce. La prossima sezione di questo articolo esplora come convertire byte in stringhe.

Convertire byte in stringhe: il metodo .decode()

Un oggetto bytes in Python è leggibile dall'uomo solo quando contiene caratteri ASCII leggibili. Nella maggior parte delle applicazioni, questi caratteri non sono sufficienti. Possiamo convertire un oggetto bytes in una stringa usando il metodo .decode():

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
text = data.decode()

print(text)
print(type(text))
DataCamp
<class 'str'>

Tuttavia, esistono diverse codifiche per convertire tra byte e stringhe. Gli interi nell'esempio sopra rappresentano caratteri ASCII stampabili. Tuttavia, la codifica predefinita usata quando non si passa alcun argomento a .decode() è UTF-8, non ASCII. UTF-8 è la codifica più usata per i caratteri Unicode.

I primi 128 codici UTF-8 corrispondono ai codici ASCII, motivo per cui l'oggetto bytes data viene decodificato nella stringa "DataCamp" nell'esempio sopra.

Tuttavia, Unicode contiene quasi 150.000 caratteri. UTF-8 codifica tutti i caratteri non ASCII in Unicode usando due o più byte.

Creiamo un nuovo oggetto bytes e decodifichiamolo:

data = bytes([195, 169])
print(data)

text = data.decode()
print(text)
b'\xc3\xa9'
é

L'oggetto bytes contiene due byte: gli interi 195 e 169. Python mostra la rappresentazione esadecimale di questi byte. Tuttavia, .decode() restituisce una stringa decodificando l'oggetto bytes usando la codifica UTF-8. La coppia di byte b'\xc3\xa9' rappresenta la lettera e con accento acuto, é.

Il metodo .decode() accetta un argomento facoltativo per specificare la codifica:

text = data.decode("utf-8")
print(text)
é

UTF-8 è la codifica predefinita, ma si possono usare altre codifiche. Possiamo anche convertire una stringa in un oggetto bytes usando il metodo della stringa .encode() con varie codifiche:

text = "éclair"
data = text.encode("utf-8")
print(data)

data = text.encode("utf-16")
print(data)
b'\xc3\xa9clair'
b'\xff\xfe\xe9\x00c\x00l\x00a\x00i\x00r\x00'

La stessa stringa si converte in oggetti bytes diversi a seconda della codifica dei caratteri utilizzata.

Errori di codifica

La scelta delle codifiche dei caratteri può portare a errori se si usa una codifica diversa durante la conversione tra byte e stringhe. Usiamo l'esempio con la stringa "éclair" codificata in byte usando la codifica UTF-8:

text = "éclair"
data = text.encode("utf-8")
print(data)
b'\xc3\xa9clair'

Questa sequenza di byte rappresenta caratteri usando la codifica UTF-8. Il metodo .decode() genera un errore se usiamo la codifica sbagliata:

text = data.decode("ascii")
print(text)
Traceback (most recent call last):
 ...
   text = data.decode("ascii")
          ^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Tuttavia, possiamo includere l'argomento facoltativo errors per gestire eventuali errori. Il valore predefinito per il parametro errors è "strict", che solleva un errore per i caratteri non validi.

Il metodo .decode() può essere chiamato con errors="ignore" per ignorare tutti i caratteri non validi:

text = data.decode("ascii", errors="ignore")
print(text)
clair

Il primo carattere nella stringa originale è é, che non è un carattere ASCII. Pertanto, .decode() restituisce una stringa senza il primo carattere.

Un'altra opzione è chiamare .decode() con errors="replace", che sostituisce i byte non validi con �:

text = data.decode("ascii", errors="replace")
print(text)
��clair

Questo output mostra che mancano dei caratteri nella stringa. La scelta della gestione degli errori dipende dall'applicazione.

Convertire byte in stringhe con str()

Il metodo .decode() è la via principale per convertire byte in stringhe. Tuttavia, è anche possibile usare direttamente il costruttore str(). Usare il costruttore str() su un oggetto bytes creerà una rappresentazione testuale dei byte grezzi:

data = b'\xc3\xa9clair'
text = str(data)

print(text)
print(type(text))
b'\xc3\xa9clair'
<class 'str'>

Tuttavia, il costruttore str() accetta anche un argomento encoding, che possiamo usare per creare una stringa basata su una specifica codifica:

text = str(data, encoding='utf-8')
print(text)
éclair

Convertire byte in stringhe con codecs.decode()

Il modulo codecs della libreria standard di Python fornisce l'interfaccia per codificare e decodificare dati. Questo modulo fornisce anche una funzione .decode() che può essere usata per convertire byte di Python in stringhe:

import codecs

​data = b'\xc3\xa9clair'
text = codecs.decode(data, encoding='utf-8')
print(text)
éclair

Queste tecniche di conversione alternative non sono metodi del tipo bytes, ma funzioni che richiedono di passare l'oggetto bytes come argomento.

Conclusione

I dati sono spesso trasferiti come byte e molte applicazioni Python devono convertire tra byte e stringhe. Un oggetto bytes è una sequenza immutabile di byte che può essere convertita in una string usando una delle diverse codifiche dei caratteri.

La via principale per convertire byte di Python in una stringa è il metodo .decode(), che permette di scegliere una codifica e una strategia di gestione degli errori.

Puoi proseguire il tuo apprendimento di Python con i seguenti tutorial e corsi:

Stephen Gruppetta

Autore

Stephen Gruppetta

Ho studiato Fisica e Matematica a livello UG presso l’Università di Malta. Poi mi sono trasferito a Londra e ho conseguito il dottorato in Fisica all’Imperial College. Ho lavorato su nuove tecniche ottiche per immagini della retina umana. Ora mi concentro sullo scrivere di Python, comunicare su Python e insegnare Python.

Argomenti

Correlato