파이썬 3부터 bytes 타입은 이진 데이터를 저장하고 처리하는 기본 타입이 되었으며, 문자열(str)과 분리되었습니다. 파이썬 2에서는 문자열(str)이 텍스트와 바이트를 모두 포함할 수 있어, 서로 다른 인코딩에서 데이터를 처리할 때 자주 오류가 발생했습니다.
일상적인 프로그래밍에서 텍스트 정보의 맥락 외부에서 데이터를 전송하고 저장해야 하는 작업을 종종 접하게 됩니다. 예를 들어 파일, 네트워크 요청 및 교환 프로토콜 작업 등을 포함합니다. 이를 위해서는 바이트 시퀀스와 문자열 데이터 간의 명확한 구분을 제공하는 안전하고 편리한 타입이 필요합니다.
파이썬의 bytes 타입은 변경할 수 없는 바이트 시퀀스(0에서 255 사이의 정수)를 저장하며, 바이트 리터럴(접두사 b) 또는 명시적 타입 변환을 통해 생성될 수 있습니다. 문자열(str)과 바이트(bytes) 간의 안전하고 예측 가능한 상호작용을 위해 .encode() 및 .decode() 메서드가 사용됩니다. 파일, 네트워크 및 다양한 이진 프로토콜 작업 시 bytes는 기본 선택입니다.
예제 코드:
# bytes 객체 만들기 b = b'hello' # 리터럴 사용 b2 = bytes([104, 101, 108, 108, 111]) # 정수 리스트에서 생성 # str <=> bytes 변환 text = '텍스트' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # 파일 예제 with open('file.bin', 'rb') as f: data = f.read() # data: bytes
주요 특징:
bytes와 str을 하나의 변수에 연결할 수 있나요?
아니요, + 또는 f-스트링을 통해 연결하는 것은 작동하지 않습니다: b'abc' + 'def'를 실행하면 TypeError가 발생합니다. 타입을 명시적으로 변환해야 합니다.
bytes와 bytearray의 차이점은 무엇인가요?
bytes는 변경할 수 없는 타입으로, 생성 후 내용을 변경할 수 없습니다. bytearray는 변경 가능하며 바이트를 제자리에서 변경하는 메서드를 지원합니다.
b = bytes([1, 2, 3]) # immutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # OK b[0] = 99 # TypeError
encode()를 통해 문자열이 몇 바이트를 차지할지 어떻게 알 수 있나요?
바이트 수는 인코딩에 따라 다릅니다. 예를 들어, 'abc'는 utf-8에서 3바이트이고, '안녕하세요'는 12바이트입니다. encode()를 호출한 후에만 len()을 통해 정확한 크기를 알 수 있습니다:
s = '안녕하세요' # 6 글자 b = s.encode('utf-8') # 12 바이트 print(len(b)) # 12
개발자가 'rb' 모드로 파일을 읽고 그것을 문자열로 직접 처리하려고 합니다:
with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes
장점:
단점:
개발자가 디코드를 통해 바이트 스트림을 처리하고 인코딩 제어를 추가합니다:
with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())
장점:
단점: