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

  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

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.

Gerelateerde Artikelen - Python Bytes

  • Hoe bytes naar gehele getallen te converteren
  • Hoe Int naar Bytes te converteren in Python 2 en Python 3
  • Hoe String naar Bytes te converteren in Python
  • Gerelateerde Artikelen - Python Encoding-Decoding

  • Hoe bytes naar gehele getallen te converteren
  • Hoe Int naar Bytes te converteren in Python 2 en Python 3
  • Hoe String naar Bytes te converteren in Python
  • Gerelateerde Artikelen - Python String

  • Hoe bytes naar gehele getallen te converteren
  • Hoe Int naar Bytes te converteren in Python 2 en Python 3
  • Hoe String naar Bytes te converteren in Python