Python에서
bytes
와bytearray
는
binary data를 byte 단위 (1byte = 8bit)로 다루는데
사용되는 Data Type임.
bytes
:
bytes
는 immutable byte sequence 로서 일종의 byte로 구성된tuple
에 해당 함.byte literal
은 다음과 같이b
라는 prefix를 사용함.b'Hello'
은'Hello'
라는 문자열에 대한byte literal
을 의미함.- 문자열에 대한 bytes 이므로 encoding이 사용되며 기본으로
utf8
이 사용됨. byte literal
과 같이 추후 변경이 되지 않는 binary data를 위한 데이터 타입이bytes
임.
bytes
객체를 출력할 경우,utf8
인 경우에는 ascii에 해당하는 바이트는 ascii 문자로 출력되고- ascii에 해당하지 않는 1바이트는 hex sequence 로 표현함 (backslash
\
와x
를 통해 hex, 16진법을 사용함을 표시하고, 2개의 숫자로 1byte를 표현) utf16
등의 encoding을 사용한 경우에는- hex sequence로 표현된다.
다음의 코드와 출력 결과를 위의 설명과 함께 참고할 것.
s = 'Hello'
b = s.encode('utf8')
print(type(b), b)
print(b'Hello' == b)
b = s.encode('utf16')
print(type(b), b)
결과는 다음과 같음.
<class 'bytes'> b'Hello'
True
b'Hello'
<class 'bytes'> b'\xff\xfeH\x00e\x00l\x00l\x00o\x00'
literal 용어가 익숙치 않다면 다음을 참고.
https://dsaint31.tistory.com/462
bytearray
:
bytearray
는 mutable byte sequence 로서 일종의 byte로 구성된list
임.bytearray(b'Hello')
를 통해'Hello'
의 utf8 인코딩에 해당하는bytes
객체를 기준으로bytearray
로 변환.
- 해당
bytesarray
는 변경가능함.arr = bytearray(b'Hello')
를 수행하고arr[0] = b'J'
와 같은 코드를 수행하면arr
은b'Jello'
로 변경됨.
참고할 것.
Python에서 디코딩은 특정 인코딩방식에 따라 bytes
를 str
로 변경하는 것을 의미하고, 인코딩은 str
로부터 bytes
를 얻어내는 것을 가르킴.
기본적으로는 utf8
을 사용함.
str
객체의 경우encode
메서드를 통해 encoding방식에 따른bytes
를 얻을 수 있음 (기본은utf8
이나ascii
나utf16
등을 지정가능함).bytes
또는bytearray
객체는decode
메서드를 통해 특정 encoding 방식에 따른 해당하는str
을 얻을 수 있음.- 만약 decoding시 적용하는 encoding 방식에 지정되지 않은 바이트값이 있는 경우, 에러가 발생함.
errors='ignore'
을 인자로 주면 에러를 무시하고 변환.
다음 예를 참고할 것.
np_c = bytes([128])
np_c_str = np_c.decode('ascii',errors='ignore')
np_c1 = bytes([129])
np_c1_str = np_c.decode('ascii',errors='ignore')
with open('bin2txt.txt', 'wb') as f:
f.write('a'.encode('ascii'))
f.write(np_c)
f.write(np_c1)
f.write('b'.encode('ascii'))
null_c = bytes([0])
null_str = null_c.decode('ascii', errors='ignore')
# encoding에 정의되지 않은 bytes들은 text 에서 일종의 빈 문자 등으로 처리해버림.
# decode에서 errors='strict' 로 주어질 경우 아예 decode가 되지 않게도 할 수 있으나,
# 많은 앱에선 일종의 null처럼 처리해버림. (단 null과 같진 않은 경우가 대부분.)
print(f"[{np_c_str}], [{np_c1_str}], {np_c_str == np_c1_str}")
print(f"[{np_c_str}], [{null_str}], {np_c_str == null_str}")
결과는 다음과 같음.
[], [], True
[], [], False
같이 읽어보면 좋은 URLs
2024.01.15 - [Python] - [python] Text mode vs. Binary mode: File open
https://dsaint31.me/mkdocs_site/CE/ch01/code_for_character/#encodings-for-unicode
'Python' 카테고리의 다른 글
[Python] Binary Operations (0) | 2024.01.15 |
---|---|
[Python] `struct` 사용하기: bytes 로 C언어 구조체 다루기. (1) | 2024.01.15 |
[python] Text mode vs. Binary mode: File open (0) | 2024.01.15 |
[pandas] 데이터 타입에 따른 column 추출 (0) | 2024.01.12 |
[pandas] merge 예제. (0) | 2024.01.12 |