Een van de minder bekende ingebouwde sequentietypen in Python is bytes, een onveranderlijke reeks gehele getallen. Elk geheel getal staat voor één byte aan data. Data wordt vaak als bytes over netwerken en tussen programma’s verstuurd. Bytes zijn niet leesbaar voor mensen, en in onze Python-programma’s moeten we ze vaak omzetten naar strings.
In deze tutorial bekijken we technieken om bytes naar strings te converteren in Python. Ben je geïnteresseerd in de omgekeerde bewerking, bekijk dan mijn tutorial over hoe je strings naar bytes converteert in Python.
We beginnen met een kort antwoord voor als je haast hebt.
Kort antwoord: bytes naar string converteren in Python
De belangrijkste tool om bytes naar strings te converteren in Python is de methode .decode():
data =b"\xc3\xa9clair"
text = data.decode(encoding="utf-8")print(text)Mogelijk gemaakt door
De methode .decode() geeft een string terug die het bytes-object weergeeft. In dit voorbeeld is UTF-8-decoding gebruikt. UTF-8 is de standaardcodering, dus het is niet vereist in het bovenstaande voorbeeld, maar we kunnen ook andere coderingen gebruiken.
Bytes en strings in Python begrijpen
Python heeft een ingebouwde bytes-datastructuur, een onveranderlijke reeks gehele getallen in het bereik 0 tot en met 255. Een geheel getal binnen dit bereik van 256 getallen kan worden weergegeven met acht bits aan data, wat gelijk is aan één byte. Daarom is elk element in een bytes-object een geheel getal dat één byte vertegenwoordigt.
Laten we de bytes()-constructor gebruiken om een bytes-object te maken van een lijst:
Traceback (most recent call last):
...
data[0] = 100
~~~~^^^
TypeError: 'bytes' object does not support item assignmentMogelijk gemaakt door
Python geeft een TypeError als we proberen een waarde binnen deze reeks te veranderen. Laten we bevestigen dat een bytes-object alleen gehele getallen kan bevatten in het bereik van 0 tot en met 255:
Traceback (most recent call last):
...
data = bytes([254, 255, 256])
^^^^^^^^^^^^^^^^^^^^^^
ValueError: bytes must be in range(0, 256)Mogelijk gemaakt door
De ValueError geeft aan dat een geheel getal dat een byte vertegenwoordigt, lid moet zijn van range(0, 256). Het einde van het bereik is uitgesloten, zoals gebruikelijk bij een getalbereik in Python.
De representatie laat het bytes-object zien weergegeven met tekens. Python toont de gehele getallen met de ASCII-tekens die bij die waarden horen. Het voorvoegsel b vóór de tekens tussen aanhalingstekens geeft aan dat dit een bytes-object is.
We kunnen ook een bytes-object maken met de bytesliteral rechtstreeks:
Het object wordt weergegeven met tekens, maar de elementen zijn gehele getallen.
bytes-objecten zijn echter alleen leesbaar voor mensen wanneer ze gehele getallen gebruiken die overeenkomen met afdrukbare ASCII-tekens. Omdat ASCII een 7-bits codering is, bevat het 128 codes, maar slechts 95 van deze ASCII-tekens zijn afdrukbaar.
Gehele getallen tussen 0 en 127 die geen afdrukbaar ASCII-teken hebben en gehele getallen tussen 128 en 255 worden weergegeven als hexadecimale getallen:
Het eerste geheel getal in de lijst is nu 0, wat geen afdrukbaar teken in ASCII is. Het bytes-object toont dit geheel getal als \x00, de hexadecimale representatie van 0. Het laatste geheel getal is 200, wat buiten het ASCII-bereik valt maar binnen het bereik van gehele getallen die in bytes kunnen worden gebruikt. Python toont dit geheel getal als \xc8, wat 200 is in hexadecimaal.
De datastructuren bytes en strings delen gemeenschappelijke kenmerken. Het zijn allebei onveranderlijke reeksen, maar bytes bevatten gehele getallen, terwijl strings tekens bevatten:
data =bytes([68,97,116,97,67,97,109,112])print(data[0])
text ="DataCamp"print(text[0])Mogelijk gemaakt door
Bytes worden gebruikt om data over netwerken en tussen verschillende interfaces over te dragen. In de volgende sectie van dit artikel bekijken we hoe je bytes naar strings converteert.
Bytes naar strings converteren: de methode .decode()
Een bytes-object in Python is alleen leesbaar voor mensen wanneer het leesbare ASCII-tekens bevat. In de meeste toepassingen zijn deze tekens niet voldoende. We kunnen een bytes-object omzetten naar een string met de methode .decode():
data =bytes([68,97,116,97,67,97,109,112])
text = data.decode()print(text)print(type(text))Mogelijk gemaakt door
Er bestaan echter verschillende coderingen om tussen bytes en strings te converteren. De gehele getallen in het bovenstaande voorbeeld vertegenwoordigen afdrukbare ASCII-tekens. De standaardcodering die wordt gebruikt wanneer geen argument aan .decode() wordt doorgegeven, is echter UTF-8 en niet ASCII. UTF-8 is de meest gebruikte codering voor Unicode-tekens.
De eerste 128 UTF-8-codes komen overeen met de ASCII-codes, daarom wordt het bytes-object data in het bovenstaande voorbeeld gedecodeerd naar de string "DataCamp".
Unicode bevat echter bijna 150.000 tekens. UTF-8 codeert alle niet-ASCII-tekens in Unicode met twee of meer bytes.
Laten we een nieuw bytes-object maken en het decoderen:
data =bytes([195,169])print(data)
text = data.decode()print(text)Mogelijk gemaakt door
Het bytes-object bevat twee bytes: de gehele getallen 195 en 169. Python toont de hexadecimale representatie van deze bytes. .decode() geeft echter een string terug door het bytes-object te decoderen met de UTF-8-codering. Het paar bytes b'\xc3\xa9' stelt de letter e met een accent aigu voor, é.
De methode .decode() accepteert een optioneel argument om de codering te specificeren:
UTF-8 is de standaardcodering, maar andere coderingen kunnen ook worden gebruikt. We kunnen een string ook omzetten naar een bytes-object met de stringmethode .encode() met verschillende coderingen:
text ="éclair"
data = text.encode("utf-8")print(data)
data = text.encode("utf-16")print(data)Mogelijk gemaakt door
Dezelfde string wordt omgezet naar verschillende bytes-objecten, afhankelijk van welke tekencodering we gebruiken.
Coderingsfouten
De keuze van tekencoderingen kan tot fouten leiden als bij het converteren tussen bytes en strings een andere codering wordt gebruikt. Laten we het voorbeeld nemen met de string "éclair" die naar bytes is gecodeerd met de UTF-8-codering:
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)Mogelijk gemaakt door
We kunnen echter het optionele argument errors gebruiken om fouten af te handelen. De standaardwaarde voor de parameter errors is "strict", die een fout opgeeft voor ongeldige tekens.
De methode .decode() kan worden aangeroepen met errors="ignore" om alle ongeldige tekens te negeren:
Deze output laat zien dat er tekens ontbreken in de string. De keuze voor foutafhandeling hangt af van de toepassing.
Bytes naar strings converteren met str()
De methode .decode() is de belangrijkste manier om bytes naar strings te converteren. Het is echter ook mogelijk om direct de str()-constructor te gebruiken. Het gebruik van de str()-constructor op een bytes-object creëert een stringrepresentatie van de ruwe bytes:
data =b'\xc3\xa9clair'
text =str(data)print(text)print(type(text))Mogelijk gemaakt door
Bytes naar strings converteren met codecs.decode()
De module codecs in de standaardbibliotheek van Python biedt de interface voor het encoderen en decoderen van data. Deze module biedt ook een functie .decode() die kan worden gebruikt om Python-bytes naar strings te converteren:
import codecs
data =b'\xc3\xa9clair'
text = codecs.decode(data, encoding='utf-8')print(text)Mogelijk gemaakt door
Deze alternatieve conversietechnieken zijn geen methoden van het type bytes maar functies waarvoor het bytes-object als argument moet worden doorgegeven.
Conclusie
Data wordt vaak als bytes overgedragen, en veel Python-toepassingen moeten tussen bytes en strings converteren. Een bytes-object is een onveranderlijke reeks bytes die kan worden omgezet naar een string met een van meerdere tekencoderingen.
De belangrijkste manier om Python-bytes naar een string te converteren is de methode .decode(), waarmee je een codering en een strategie voor foutafhandeling kunt kiezen.
Je kunt verder leren met de volgende Python-tutorials en -cursussen:
Ik studeerde natuurkunde en wiskunde op bachelorniveau aan de Universiteit van Malta. Daarna verhuisde ik naar Londen en behaalde ik mijn PhD in natuurkunde aan Imperial College. Ik werkte aan nieuwe optische technieken om het menselijk netvlies in beeld te brengen. Nu richt ik me op schrijven over Python, communiceren over Python en lesgeven in Python.
Een van de minder bekende ingebouwde sequentietypen in Python is bytes, een onveranderlijke reeks gehele getallen. Elk geheel getal staat voor één byte aan data. Data wordt vaak als bytes over netwerken en tussen programma’s verstuurd. Bytes zijn niet leesbaar voor mensen, en in onze Python-programma’s moeten we ze vaak omzetten naar strings.
In deze tutorial bekijken we technieken om bytes naar strings te converteren in Python. Ben je geïnteresseerd in de omgekeerde bewerking, bekijk dan mijn tutorial over hoe je strings naar bytes converteert in Python.
We beginnen met een kort antwoord voor als je haast hebt.
Kort antwoord: bytes naar string converteren in Python
De belangrijkste tool om bytes naar strings te converteren in Python is de methode
.decode():De methode
.decode()geeft een string terug die hetbytes-object weergeeft. In dit voorbeeld is UTF-8-decoding gebruikt. UTF-8 is de standaardcodering, dus het is niet vereist in het bovenstaande voorbeeld, maar we kunnen ook andere coderingen gebruiken.Bytes en strings in Python begrijpen
Python heeft een ingebouwde
bytes-datastructuur, een onveranderlijke reeks gehele getallen in het bereik 0 tot en met 255. Een geheel getal binnen dit bereik van 256 getallen kan worden weergegeven met acht bits aan data, wat gelijk is aan één byte. Daarom is elk element in eenbytes-object een geheel getal dat één byte vertegenwoordigt.Laten we de
bytes()-constructor gebruiken om eenbytes-object te maken van een lijst:Deze reeks gehele getallen is onveranderlijk:
Python geeft een
TypeErrorals we proberen een waarde binnen deze reeks te veranderen. Laten we bevestigen dat eenbytes-object alleen gehele getallen kan bevatten in het bereik van 0 tot en met 255:De
ValueErrorgeeft aan dat een geheel getal dat een byte vertegenwoordigt, lid moet zijn vanrange(0, 256). Het einde van het bereik is uitgesloten, zoals gebruikelijk bij een getalbereik in Python.We kunnen het bytes-object weergeven met
print():De representatie laat het
bytes-object zien weergegeven met tekens. Python toont de gehele getallen met de ASCII-tekens die bij die waarden horen. Het voorvoegsel b vóór de tekens tussen aanhalingstekens geeft aan dat dit eenbytes-object is.We kunnen ook een
bytes-object maken met de bytesliteral rechtstreeks:Het object wordt weergegeven met tekens, maar de elementen zijn gehele getallen.
bytes-objecten zijn echter alleen leesbaar voor mensen wanneer ze gehele getallen gebruiken die overeenkomen met afdrukbare ASCII-tekens. Omdat ASCII een 7-bits codering is, bevat het 128 codes, maar slechts 95 van deze ASCII-tekens zijn afdrukbaar.Gehele getallen tussen 0 en 127 die geen afdrukbaar ASCII-teken hebben en gehele getallen tussen 128 en 255 worden weergegeven als hexadecimale getallen:
Het eerste geheel getal in de lijst is nu 0, wat geen afdrukbaar teken in ASCII is. Het
bytes-object toont dit geheel getal als\x00, de hexadecimale representatie van 0. Het laatste geheel getal is 200, wat buiten het ASCII-bereik valt maar binnen het bereik van gehele getallen die in bytes kunnen worden gebruikt. Python toont dit geheel getal als\xc8, wat 200 is in hexadecimaal.De datastructuren
bytesen strings delen gemeenschappelijke kenmerken. Het zijn allebei onveranderlijke reeksen, maarbytesbevatten gehele getallen, terwijl strings tekens bevatten:Bytes worden gebruikt om data over netwerken en tussen verschillende interfaces over te dragen. In de volgende sectie van dit artikel bekijken we hoe je bytes naar strings converteert.
Bytes naar strings converteren: de methode
.decode()Een
bytes-object in Python is alleen leesbaar voor mensen wanneer het leesbare ASCII-tekens bevat. In de meeste toepassingen zijn deze tekens niet voldoende. We kunnen eenbytes-object omzetten naar een string met de methode.decode():Er bestaan echter verschillende coderingen om tussen bytes en strings te converteren. De gehele getallen in het bovenstaande voorbeeld vertegenwoordigen afdrukbare ASCII-tekens. De standaardcodering die wordt gebruikt wanneer geen argument aan
.decode()wordt doorgegeven, is echter UTF-8 en niet ASCII. UTF-8 is de meest gebruikte codering voor Unicode-tekens.De eerste 128 UTF-8-codes komen overeen met de ASCII-codes, daarom wordt het bytes-object data in het bovenstaande voorbeeld gedecodeerd naar de string
"DataCamp".Unicode bevat echter bijna 150.000 tekens. UTF-8 codeert alle niet-ASCII-tekens in Unicode met twee of meer bytes.
Laten we een nieuw
bytes-object maken en het decoderen:Het
bytes-object bevat twee bytes: de gehele getallen 195 en 169. Python toont de hexadecimale representatie van deze bytes..decode()geeft echter een string terug door hetbytes-object te decoderen met de UTF-8-codering. Het paar bytesb'\xc3\xa9'stelt de letter e met een accent aigu voor, é.De methode
.decode()accepteert een optioneel argument om de codering te specificeren:UTF-8 is de standaardcodering, maar andere coderingen kunnen ook worden gebruikt. We kunnen een string ook omzetten naar een
bytes-object met de stringmethode.encode()met verschillende coderingen:Dezelfde string wordt omgezet naar verschillende
bytes-objecten, afhankelijk van welke tekencodering we gebruiken.Coderingsfouten
De keuze van tekencoderingen kan tot fouten leiden als bij het converteren tussen bytes en strings een andere codering wordt gebruikt. Laten we het voorbeeld nemen met de string
"éclair"die naar bytes is gecodeerd met de UTF-8-codering:Deze reeks bytes vertegenwoordigt tekens met de UTF-8-codering. De methode
.decode()geeft een fout als we de verkeerde codering gebruiken:We kunnen echter het optionele argument
errorsgebruiken om fouten af te handelen. De standaardwaarde voor de parametererrorsis"strict", die een fout opgeeft voor ongeldige tekens.De methode
.decode()kan worden aangeroepen meterrors="ignore"om alle ongeldige tekens te negeren:Het eerste teken in de oorspronkelijke string is é, wat geen ASCII-teken is. Daarom retourneert
.decode()een string zonder het eerste teken.Een andere optie is
.decode()aan te roepen meterrors="replace", wat ongeldige bytes vervangt door �:Deze output laat zien dat er tekens ontbreken in de string. De keuze voor foutafhandeling hangt af van de toepassing.
Bytes naar strings converteren met
str()De methode
.decode()is de belangrijkste manier om bytes naar strings te converteren. Het is echter ook mogelijk om direct destr()-constructor te gebruiken. Het gebruik van destr()-constructor op eenbytes-object creëert een stringrepresentatie van de ruwe bytes:De
str()-constructor accepteert echter ook een argumentencoding, waarmee we een string kunnen maken op basis van een specifieke codering:Bytes naar strings converteren met codecs.decode()
De module
codecsin de standaardbibliotheek van Python biedt de interface voor het encoderen en decoderen van data. Deze module biedt ook een functie.decode()die kan worden gebruikt om Python-bytes naar strings te converteren:Deze alternatieve conversietechnieken zijn geen methoden van het type
bytesmaar functies waarvoor hetbytes-object als argument moet worden doorgegeven.Conclusie
Data wordt vaak als bytes overgedragen, en veel Python-toepassingen moeten tussen bytes en strings converteren. Een
bytes-object is een onveranderlijke reeks bytes die kan worden omgezet naar eenstringmet een van meerdere tekencoderingen.De belangrijkste manier om Python-bytes naar een string te converteren is de methode
.decode(), waarmee je een codering en een strategie voor foutafhandeling kunt kiezen.Je kunt verder leren met de volgende Python-tutorials en -cursussen: