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

Jinku Hu 2023년10월10일
  1. Python 2.x 에서 바이트를 문자열로 변환
  2. Python 3.x 에서 바이트를 문자열로 변환
  3. 바이트를 문자열로 수렴하는 다양한 방법의 성능 비교 및 ​​결론
Python 2 및 Python 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 을 사용하면서 리스트 내포 또는 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 를 사용하는 것이 좋습니다.

작가: 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 Facebook

관련 문장 - Python Bytes

관련 문장 - Python String