끄적거림

[Tips] byte, str 타입 오류(feat. TypeError: write() argument must be str, not bytes) 본문

Python

[Tips] byte, str 타입 오류(feat. TypeError: write() argument must be str, not bytes)

Signing 2020. 2. 21. 11:10
728x90
반응형

일반적으로 python3의 내장함수인 open( ) 함수를 사용할 때 주의할 점이 있다.

open( )함수는 기본적으로 UTF-8인코딩 방법을 사용한다.

 

예를 들어 다음의 코드를 실행시키려 한다.

with open('C:/Users/DAL/Desktop/test.txt', 'w') as f:
    f.write(os.urandom(10))

(※ os.urandom( ) 함수는 원하는 길이(byte단위)의 unsigned 수치값을 만들어 준다.)

 

그럼 다음과 같은 에러코드가 발생한다.

<TypeError>

왜 이런 에러가 발생할까?

 

 

python3에는 크게 2가지 문자 sequence 타입이 있다.

  • bytes : raw 8-bit(=binary)
  • str : Unicode

좀 더 원시적인(?) 타입이 bytes가 되겠고 이를 보기 쉽게(?) 표현한 것이 str 타입이 되겠다.
Unicode를 binary데이터로 표현하는 방법 중 가장 흔하고 많이 쓰이는 방식이 바로 UTF-8 인코딩 방법이다.

 

만약, Unicode --> Binary 로 바꾸고 싶다면 encode( ) 함수를 사용해야하고,
Binary --> Unicode 로 바꾸고 싶다면 decode( ) 함수를 사용해야한다.

 

 

여기서 해결 방법은 다음 코드와 같다.

with open('C:/Users/DAL/Desktop/test2.txt', 'wb') as f:
    f.write(os.urandom(10))

'wb' 모드로 바꾸어 실행하면 정상 작동한다.

 

※ 'w' : 문자 쓰기 모드, 'wb' : 바이너리 쓰기 모드

 

728x90
반응형
Comments