Python 2 및 Python 3에서 바이트를 문자열로 변환하는 방법

  1. Python 2.x 에서 바이트를 문자열로 변환
  2. Python 3.x 에서 바이트를 문자열로 변환
  3. 바이트를 문자열로 수렴하는 다양한 방법의 성능 비교 및 ​​결론

이 튜토리얼 기사는 Python 2.x 와 Python 3.x 에서 bytes 를 문자열로 변환하는 방법을 소개합니다.

Python 2.x 에서 바이트를 문자열로 변환

Python 2.7의 bytesstr 과 동일하므로 bytes 로 시작된 변수는 본질적으로 문자열입니다.

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'>

Python 3.x 에서 바이트를 문자열로 변환

bytes 는 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'>
>>> 

bytes 에있는 원소의 데이터 타입은 int 입니다.

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

Python 3.x 에서 decode 를 사용하여 바이트를 문자열로 변환

bytes.decode 메소드는 주어진 encoding 메소드를 사용하여 바이트를 문자열로 변환 할 수 있습니다. encoding 메소드를 기본 utf-8 로 두는 것이 대부분의 경우 괜찮지 만, 바이트가 utf-8 이 아닌 다른 인코딩 방법으로 인코딩 될 수 있기 때문에 항상 안전하지는 않습니다.

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

utf-8 이 인코딩 방법으로 사용되므로 위에 표시된 것처럼 ‘바이트’를 디코딩하는 세 가지 방법은 동일합니다.

utf-8 을 사용하지만 바이트가 인코딩되지 않으면 오류가 발생할 수 있습니다.

>>> 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

우리는 utf-8 이 올바른codec이 아니라는 UnicodeDecodeError 를 얻는다.

이 ‘인코딩’문제를 해결하기위한 두 가지 접근 방식이 있습니다.

오류에 대한 매개 변수로 backslashreplace,ignore 또는 replace

decode 에는 encoding-errors 외에 다른 매개 변수가 있습니다. ‘오류’발생시 동작을 정의합니다. errors의 기본값은 strict이며 이는 디코딩 과정에서 오류가 발생하면 오류가 발생 함을 의미합니다.

error 에는 ignore,replace 또는 기타 등록 된 codecs.register_error 이름과 같은 다른 옵션 (예 : backslashreplace)이 있습니다.

ignore 는 잘못된 디코딩 오류를 무시하고 가능한 한 출력 문자열을 만듭니다.

replace 는 해당하는 문자를 주어진 encoding 메소드에 정의 된 문자로 대체합니다.backslashreplace 는 원래 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 인코딩을 사용할 수 있습니다.

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

파이썬 3.x 에서 바이트를 문자열로 변환하는 chr

chr(i, /)는 서 수가있는 한 문자의 유니 코드 문자열을 반환합니다. bytes 요소를 string 으로 변환 할 수 있지만 완전한 bytes 는 변환 할 수 없습니다.

개별 요소에 chr 을 사용하면서 list comprehension 또는 map 을 사용하여 변환 된 bytes 문자열을 얻을 수 있습니다.

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

바이트를 문자열로 수렴하는 다양한 방법의 성능 비교 및 ​​결론

우리는 timeit 를 사용하여이 튜토리얼에서 소개 된 메소드의 성능 인 decodechr 을 비교합니다.

>>> 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

위에서 보여준 시간 성능에서 알 수 있듯이 decode()는 훨씬 빠르며 chr()는 단일 문자열 문자에서 문자열을 재구성해야하기 때문에 상대적으로 비효율적입니다.

성능이 중요한 응용 프로그램에서는 decode 를 사용하는 것이 좋습니다.

관련 문장 - Python Bytes

  • 파이썬에서 문자열을 바이트로 변환하는 방법
  • Python 2.7 및 3.x 에서 바이트를 정수로 변환하는 방법
  • 관련 문장 - Python Encoding-Decoding

  • 파이썬에서 문자열을 바이트로 변환하는 방법