더북(TheBook)

다른 방법으로, open 함수의 encoding 파라미터를 명시하면 플랫폼에 따라 동작이 달라져서 놀라는 일을 막을 수 있다. 예를 들어 다음 코드에는 파일에 들어 있는 이진 데이터가 실제로 cp1252(윈도우에서 사용하던 레거시 인코딩 방식)로 돼 있다고 가정한다.

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

assert data == 'ñòóôõ'

예외가 사라졌고, 파일의 내용을 문자열로 해석한 내용은 기존 이진 데이터를 읽었을 때 반환됐던 것과 전혀 다르다. 여기서 다음 사실을 알게 된다. 여러분이 예상하는 것과 시스템의 디폴트 인코딩이 어떻게 다른지 이해하기 위해 시스템 인코딩을 항상 검사해야(python3 -c 'import locale; print(locale.getpreferredencoding())') 한다는 것이다. 디폴트 인코딩이 의심스러운 경우에는 명시적으로 openencoding 파라미터를 전달해야 한다.

기억해야 할 내용

bytes에는 8비트 값의 시퀀스가 들어 있고, str에는 유니코드 코드 포인트의 시퀀스가 들어 있다.

• 처리할 입력이 원하는 문자 시퀀스(8비트 값, UTF-8로 인코딩된 문자열, 유니코드 코드 포인트들)인지 확실히 하려면 도우미 함수를 사용하라.

bytesstr 인스턴스를 (>, ==, +, %와 같은) 연산자에 섞어서 사용할 수 없다.

• 이진 데이터를 파일에서 읽거나 파일에 쓰고 싶으면 항상 이진 모드('rb''wb')로 파일을 열어라.

• 유니코드 데이터를 파일에서 읽거나 파일에 쓰고 싶을 때는 시스템 디폴트 인코딩에 주의하라. 인코딩 차이로 놀라고 싶지 않으면 openencoding 파라미터를 명시적으로 전달하라.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.