Python 2 및 Python 3에서 바이트를 문자열로 변환하는 방법
이 튜토리얼 기사는 Python 2.x 와 Python 3.x 에서 bytes
를 문자열로 변환하는 방법을 소개합니다.
Python 2.x 에서 바이트를 문자열로 변환
Python 2.7의 bytes
는 str
과 동일하므로 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
를 사용하여이 튜토리얼에서 소개 된 메소드의 성능 인 decode
와 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
위에서 보여준 시간 성능에서 알 수 있듯이 decode()
는 훨씬 빠르며 chr()
는 단일 문자열 문자에서 문자열을 재구성해야하기 때문에 상대적으로 비효율적입니다.
성능이 중요한 응용 프로그램에서는 decode
를 사용하는 것이 좋습니다.
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 2.7 및 3.x 에서 바이트를 정수로 변환하는 방법
- Python 2 및 Python 3에서 Int 를 바이트로 변환하는 방법
- 파이썬에서 Int를 바이너리로 변환하는 방법
- 파이썬에서 문자열을 바이트로 변환하는 방법
- Python에서 문자열 앞의 B