python에는 문자열을 표현하는 두 가지 타입이 있다.
bytes와 str !
bytes 타입의 인스턴스는 부호가 없는 8바이트 데이터가 들어간다.
# python 3.8
bytes_hello = b'hello'
print(list(bytes_hello)) # [104, 101, 108, 108, 111]
print(bytes_hello) # b'hello'
str 타입의 인스턴스는 사람이 사용하는 언어의 문자를 표현하는 유니코드 코드포인트가 들어간다.
# python 3.8
str_hello = 'hello'
print(list(str_hello)) # ['h', 'e', 'l', 'l', 'o']
print(str_hello) # hello
bytes 인스턴스에는 직접 대응하는 텍스트 인코딩이 없고,
str 인스턴스에는 직접 대응하는 이진 인코딩이 없다.
이진 데이터를 유니코드 데이터로 변환하려면 bytes의 decode 메서드를 호출해야하고,
유니코드 데이터를 이진 데이터로 변환하려면 str의 encode 메서드를 호출해야한다.
# python 3.8
def to_str(bytes_or_str):
if isinstance(bytes_or_str, bytes):
return bytes_or_str.decode('utf-8')
else:
return bytes_or_str
print(to_str(bytes_hello)) # hello
print(to_str(str_hello)) # hello
print(repr(to_str(bytes_hello))) # 'hello'
print(repr(to_str(str_hello))) # 'hello'
# python 3.8
def to_bytes(bytes_or_str):
if isinstance(bytes_or_str, str):
return bytes_or_str.encode('utf-8')
else:
return bytes_or_str
print(to_bytes(bytes_hello)) # b'hello'
print(to_bytes(str_hello)) # b'hello'
print(repr(to_bytes(bytes_hello))) # b'hello'
print(repr(to_bytes(str_hello))) # b'hello'
bytes와 str 각각 인스턴스는 서로 호환되지 않는다. 즉, 서로 연산자를 이용할 수 없다.
# python 3.8
print(bytes_hello + bytes_hello) # b'hellohello'
print(str_hello + str_hello) # hellohello
print(bytes_hello + str_hello)
# Traceback (most recent call last):
# print(bytes_hello + str_hello)
# TypeError: can't concat str to bytes
참고 : 책 <파이썬 코딩의 기술>