3. bytes와 str의 차이를 알아두라

 

파이썬 문자열 데이터의 시퀀스를 표현하는 두 가지 타입

- bytes

  - 부호가 없는 8바이트 데이터가 그대로 들어감

  - 직접 대응하는 텍스트 인코딩이 없음

- str

  - 유니코드 코드 포인트가 들어 있음

  - 직접 대응하는 이진 인코딩이 없음

 

이진 데이터를 유니코드 데이터로 변환하려면 bytes의 decode 메서드를 호출해야함

일반적으로는 UTF-8 시스템 디폴트 인코딩 방식을 사용

 

문자를 표현하는 타입이 둘로 나눠져 있기 때문에 두 가지 상황에 놓인다

1. UTF-8로 인코딩된 8비트 시퀀스를 그대로 사용하고 싶음

2. 특정 인코딩을 지정하지 않은 유니코드 문자열을 사용하고 싶음

 

- bytes나 str 인스턴스를 받아서 항상 str을 반환하는 메서드

def to_str(bytes_or_str):
	if isinstance(bytes_or_str, bytes):
    	value = bytes_or_str.decode('utf-8')
    else:
    	value = bytes_or_str
    return value
    
print(repr(to_str(b'foo'))

 

-  bytes나 str 인스턴스를 받아서 항상 bytes를 반환하는 메서드

def to_bytes(bytes_or_str):
	if isinstance(bytes_or_str, bytes):
    	value = bytes_or_str.decode('utf-8')
    else:
    	value = bytes_or_str
    return value
    
print(repr(to_bytes(b'foo'))

 

연산자를 사용하면 bytes를 bytes에 더하거나 str을 str에 더할 수 있음
하지만 str 인스턴스를  bytes 인스턴스에 더할 수 없음
물론 bytes 인스턴스를 str 인스턴스에 더할 수도 없음

 

이항 연산자를 사용하면 bytes를 bytes와 비교하거나 str을 str과 비교할 수 있음

 assert b'red' > b'blue'
 assert 'red' > 'blue

그러나 str 인스턴스와 bytes 인스턴스를 비교할 수는 없음

물론 bytes와 str도 안됨

 

 

파일이 텍스트 모드인 경우 write 연산은 이진 데이터가 들어있는 bytes 인스턴스가 아니라 유니코드 데이터가 들어있는 str을 요구

따라서 'w'가 아닌 'wb' 모드로 사용해 파일을 열어야 함

with open('data.bin', 'wb') as f:
	f.write(b'~~~')

읽을 때 도 'r' 과 'rb'를 구분해서 설정해야 함

 

 

우리가 예상하는 것과 시스템의 디폴트 인코딩이 어떻게 다른지 알기 위해 항상 시스템 인코딩을 검사해야 함

명시적으로 open에 encoding 파라미터를 전달

python -c 'import locale; print(locale.getpreferredencoding())')

 

본 블로그는 [파이썬 코딩의 기술] 서적을 참고하여 작성하였습니다.

반응형

'SW ENGINEERING > Python' 카테고리의 다른 글

파이썬 코딩의 기술TIP 5일차  (0) 2021.06.07
파이썬 코딩의 기술TIP 4일차  (0) 2021.06.06
파이썬 코딩의 기술TIP 2일차  (0) 2021.06.02
파이썬 코딩의 기술TIP 1일차  (0) 2021.06.01
async와 await  (0) 2021.02.03
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기