bytes와_str의_차이_알기

매일 공부(ML)·2022년 5월 27일
0

이어드림

목록 보기
58/146

문자열 데이터의 시퀀스 표현 타입

파이썬 코딩의 기술 batter_way03입니다. 앞으로 batter_way90을 공부할 때까지 블로그 포스팅을 진행할 것입니다.


bytes

  • 부호가 없는 8바이트 데이터 들어감.

  • 아스크 인코딩을 활용하여 내부 문자 표시

a = b'h\x65llo' 
print (list (a ) ) 
print (a)
#[104,101,108,108,111]
b'hello'
  • 대응하는 텍스트 인코딩 없음

  • decode메서드: 이진 데이터를 유니코드로 변환


str

  • 사람이 사용하는 언어의 문자 표현

  • 유니코드 코드 포인트가 있음

a = 'a\u0300 propos'
print(list(a))
print(a)
  • 직접 대응하는 이진 인코딩이 없음

  • encode메서드: 유니코드 데이터를 이진 데이터로 변환

  • 프로그램의 핵심부분에서 사용

    • 다양한 텍스트 인코딩을 입력으로 받음

    • 출력 텍스트 인코등은 한 가지로 제한.(보통 UTF-8)


유니코드 샌드위치

  • 유니코드 데이터 인코딩 혹은 디코딩 부분

  • 인터페이스의 가장 먼 경계 지점에 위치 시키기


도우미 함수 활용

  • UTF- 8(또는 다른 인코딩 방식)로 인코딩된 8비트 시퀀스를 그대로 시용하고 싶다.

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

  • 두 경우를 변환해주고 입력 값이 코드가 원하는 값과 일치시키기

첫 번째 함수는 bytes나 str인스턴스를 받아서 항상 str반환

  • bytes와 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 #str 인스턴스

print(repr(to_str(b'foo')))#'foo'
print(repr(to_str('bar'))) #'bar'
print(repr(to_str(b'\xed\x95\x9c'))) # '한' :UTF-8에서 한글은 3바이트

  • bytest나 str인스턴스를 받아 항상 bytes

def to_bytes(bytes_or_str):
    if isinstance(bytes_or_str, str):
        value = bytes_or_str.encode('utf-8')
    else:
        value = bytes_or_str
    return value #bytes 인스턴스

print(repr(to_bytes(b'foo')))#b'foo'
print(repr(to_bytes('bar')))#b'bar'
print(repr(to_bytes('한글')))#b'\xed\x95\x9c\x ea\xb8\x80 ' 

기타

#str형식화 문자열에 bytes인스턴스를 넘길 수 있다.

print('red %s' %b'blue')
#그대로 b'blue'가 남기에 깔끔해보이진 않는다
#내장 함수인 open을 호출해서 얻은 파일 핸들과 관련한 연산

# 디폴트로 유니코드 문자열을 요구하고 이진 바이트 문자열을 요구 X ->코드 실행 X

with open('data.bin', 'w') as f:
    f.write(b'\xf1\xf2\xf3\xf4\xf5')

#에러 이유: 텍스트 쓰기 모드(w)로 열어서이다.

#텍스트 모드: 유니코드 데이터가 들어있는 str인스턴스 요구
#파일을 열 때 이진 쓰기 모든(wb)로 열면 해결
with open('data.bin', 'wb') as f:
    f.write(b'\xf1\xf2\xf3\xf4\xf5')
#다른 방식 해결
#open함수의 encoding 파라미터를 명시하면 플랫폼이 따라서 달라진다.

with open('data.bin', 'r', encoding='cp1252') as f:
    data = f.read()

assert data == 'fio665' 
profile
성장을 도울 아카이빙 블로그

0개의 댓글