예제에서 텍스트 파일을 binary 로 읽길래, 잠시 파일 처리에 대해 살펴봤다.

파이썬에서 텍스트 파일을 읽을 때(open) 사용하는 옵션 중 text(rt:default) 모드와 binary(rb) 모드가 있다.


말 그대로,

- text 모드는 텍스트 파일 객체로 읽어오는 것이고,

- binary 모드는 텍스트 파일을 바이너리 객체로 인코딩하여 읽어오는 것이다.

ㅋㅋ...;;;


두 모드에 대해 조금더 알아보면...


Text mode

- 이 모드로 파일을 open 하면 io.IObase 클래스를 상속받은 텍스트 파일 객체(io.TextIOWrapper)를 생성한다.

- 정해진 인코딩(encoding)으로 디코딩(decoding)이 발생하며 파일의 내용은 문자열 str 로 반환된다.

- 텍스트 인코딩을 지정하지 않을시 플랫폼의 기본 인코딩을 따른다.

- text 파일이 아닌 파일(binary=non-text)을 이 모드로 열면 글자가 깨져보여 내용을 알아볼 수 없다.


Binary mode

- 이 모드로 파일을 open 하면 io.IObase 클래스를 상속받은 바이너리 파일 객체(io.BufferedReader)를 생성한다.

- 디코딩 없이 파일의 내용은 1바이트 크기의 배열인 bytes 객체로 반환된다.

- binary 파일이 아닌 text 파일의 경우 bytes 객체로 인코딩하는 과정을 거친다.

- text 파일을 포함한 모든 binary 파일을 처리할 수 있다.

- text mode 에 비해 디스크 및 메모리가 적게 소모되며 속도가 빠르다.



예를 들어,


한글 ㅋㅋ
abc    1    def
오예
cs


위 내용처럼 한글과 영문 등이 혼합된 utf-8 로 인코딩된 파일을 binary 모드로 불러온다면


lines = open("file.txt""rb")
= 0
for line in lines:
    #line = line.decode('utf-8').strip()
    i = i + 1
    print(line)
cs


b'\xed\x95\x9c\xea\xb8\x80 \xe3\x85\x8b\xe3\x85\x8b\r\n'
b'abc\t1\tdef\r\n'
b'\xec\x98\xa4\xec\x98\x88'
cs


위 결과처럼 파이썬에서는 b로 시작하는 작은/큰따옴표 형태를 bytes 객체라고 한다. 위에서도 아스키 문자와 이스케이프 시퀀스(탭, 개행 등)를 제외하고는 binary 형태로 출력된 것을 볼 수 있다. 이 상태에서 주석을 해제하면 다시 utf-8 로 디코딩 된 문자열로 내용을 확인할 수 있다.


근데 왜 예제에서는 텍스트 파일을 바이너리 모드로 읽어왔을까...


모르겠다...ㅎㅎ; 텍스트 문서를 읽을 때 어떤 모드를 사용해도 별 문제는 없는 것 같다. 다만 어떤 모드를 사용하든 문서에 한글 등이 포함되어 있다면 인코딩을 알고 있어야 한다. 한글 Windows 의 경우 EUC-KR 을 확장한 CP949 를 사용할 것이며, 요즘은 ANSI 와의 하위호환성이 보장된 UTF-8 를 주로 사용한다.(다국어를 모두 사용할 수 있음) 편의를 위해 만들어 놨으니 text 파일은 text 모드로 binary 파일은 binary 로 처리하면 되지 않을까 싶다...




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,