Hoe bytes naar String te converteren in Python 2 en Python 3

Jinku Hu 30 januari 2023 20 december 2019
  1. Converteer Bytes naar String in Python 2.x
  2. Converteer Bytes naar String in Python 3.x
  3. Prestatievergelijking en conclusie van verschillende methoden voor het converteren van bytes naar tekenreeks
Hoe bytes naar String te converteren in Python 2 en Python 3

In dit tutorial artikel wordt uitgelegd hoe je kan converteren bytes naar een tekenreeks in Python 2.x en Python 3.x.

Converteer Bytes naar String in Python 2.x

bytes in Python 2.7 is identiek aan str , dus de geïnitieerde variabele bytes is intrinsiek de string.

Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
'cd'
>>> type(A)
<type 'str'>

Converteer Bytes naar String in Python 3.x

bytes is een nieuw gegevenstype dat is geïntroduceerd in Python 3.

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
b'cd'
>>> type(A)
<class 'bytes'>
>>> 

Het gegevenstype van elementen in de bytes is int.

>>> A = b'cd'
>>> A[0]
99
>>> type(A[0])
<class 'int'>

Converteer Bytes naar String met behulp decode van Python 3.x

.decode methode van bytes kon bytes naar string converteren met de gegeven encoding methode. In de meeste gevallen is het OK als u de encoding methode als standaard laat staan utf-8 , maar het is niet altijd veilig omdat de bytes kunnen worden gecodeerd met een andere coderingsmethode in plaats van utf-8.

>>> b'\x50\x51'.decode()
'PQ'
>>> b'\x50\x51'.decode('utf-8')
'PQ'
>>> b'\x50\x51'.decode(encoding = 'utf-8')
'PQ'

De drie manieren om de bytes bovenstaande te decoderen zijn identiek omdat utf-8 deze als coderingsmethode wordt gebruikt.

Het kan fouten veroorzaken wanneer het utf-8 wordt gebruikt, maar de bytes zijn er niet mee gecodeerd.

>>> b'\x50\x51\xffed'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    b'\x50\x51\xffed'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

We begrijpen UnicodeDecodeError dat het utf-8 niet juist is codec.

We hebben twee benaderingen om dit encoding probleem op te lossen.

backslashreplace , ignore of replace als parameters voor errors

decode heeft de andere parameter naast encoding - errors . Het definieert het gedrag wanneer een error gebeurt. De standaardwaarde van errors is strict dat dit een fout veroorzaakt als de fout optreedt tijdens het decoderingsproces.

error heeft andere opties zoals ignore , replace of andere geregistreerde codecs.register_error namen, backslashreplace bijvoorbeeld.

ignore negeert de verkeerde decodeerfouten en maakt zo mogelijk de uitvoerreeks.

replace vervangt de overeenkomstige tekens door de tekens zoals gedefinieerd in de gegeven encoding methode. backslashreplace vervangt de tekens die niet konden worden gedecodeerd met dezelfde inhoud als in het origineel bytes.

>>> b'\x50\x51\xffed'.decode('utf-8', 'backslashreplace')
'PQ\\xffed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'ignore')
'PQed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'replace')
'PQ�ed'

MS-DOS- cp437 codering kan worden gebruikt als de codering van de bytes gegevens onbekend is.

>>> b'\x50\x51\xffed'.decode('cp437')
'PQ\xa0ed'

chr om de bytes naar string te converteren in Python 3.x

chr(i, /) retourneert een Unicode-reeks van één teken met rangtelwoord. Het kan het element omzetten bytes in een string maar niet het complete bytes.

We zouden lijstbegrip kunnen gebruiken of map om de geconverteerde string te krijgen bytes tijdens het gebruik van chr voor een individueel element.

>>> A =  b'\x50\x51\x52\x53'
>>> "".join([chr(_) for _ in A])
'PQRS'
>>> "".join(map(chr, A))
'PQRS'

Prestatievergelijking en conclusie van verschillende methoden voor het converteren van bytes naar tekenreeks

We gebruiken timeit om de prestaties van de in deze tutorial geïntroduceerde methode te vergelijken - decode en chr.

>>> import timeit
>>> timeit.timeit('b"\x50\x51\x52\x53".decode()', number=1000000)
0.1356779
>>> timeit.timeit('"".join(map(chr, b"\x50\x51\x52\x53"))', number=1000000)
0.8295201999999975
>>> timeit.timeit('"".join([chr(_) for _ in b"\x50\x51\x52\x53"])', number=1000000)
0.9530071000000362

Je zou kunnen zien aan de tijd die hierboven decode() wordt getoond, is veel sneller en chr() is relatief inefficiënt omdat het de string uit het enkele string-karakter moet reconstrueren.

We adviseren het gebruik decode in de prestatie-kritische toepassing.

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

Gerelateerde Artikelen - Python Bytes

Gerelateerde Artikelen - Python String