프로그래밍/python

파이썬으로 바이너리(binary) 파일을 텍스트(text) 파일로 바꾸는 방법

콘파냐 2017. 5. 23. 04:10
반응형

텍스트(Text) 파일(아스키(ascii 파일이라고도 함)과 바이너리(Binary) 파일에 대한 내용은 C언어 포인터와 같이 진부한 주제 중에 하나라고 생각한다. 그럼에도 일반적으로 그다지 중요하지 않게 다루는 것 같은 느낌이 든다.


바이너리와 텍스트의 차이점을 설명하는 많은 글들이 있음에도 그 내용을 명확하게 이해하기 힘들 수 있다. 사실 대단히 단순한 사실인데 말이다.


사실 바이너리(Binary)라고 하면 실행파일을 말할 때가 많다. 텍스트(Text)라고 하면 문서파일이다. 그러나 리눅스에서는 텍스트 파일이라는 개념이 바이너리와 다른 것이 아니다. 그렇다면 윈도우에서는 서로 다른가?


  • 어디서 부터 잘못된 것일까?

윈도우에서는 텍스트 파일과 바이너리 파일이 분명히 구분된다. 어떤 차이냐면 저장방식의 차이다.


프로그래밍을 하면서 문자열을 다룰 때 개행문자를 "\n"로 표시하는 것은 다 알 것이다.  그런데 윈도우 상에서 어떤 프로그래밍 언어에서 파일을 텍스트 모드로 열어서 문자열을 입력하고 저장을 하면 특이한 일이 발생한다.

텍스트 모드에서는 "\n"은 "\r\n"으로 변경되어 저장됨

위 내용을 직접 눈으로 확인해 보도록 하겠다.

분명 "\n"로 저장했는데 "\r\n"으로 바뀌었다. 실제로 파일의 바이트 수를 살펴봐도 자신이 저장한 문자열에 "\r"이 추가되어 1byte가 추가됨을 알 수 있다. 그렇다면 결국 개행 하나에 1byte가 추가되는 셈이다.

\r은 0x0D 로 저장되고 (1byte) 아스키 코드 13

\n은 0x0A 로 저장된다.(1byte) 아스키 코드 10


그리고 \r\n은 0x0D0x0A 형태가 될 것이다.

이런 특징으로 인해서 텍스트 모드로 저장된 파일을 바이너리 모드로 열게되면 문제가 발생한다. 윈도우에서 만든 텍스트 문서를 리눅스에서 열 경우와 리눅스에서 만든 문서를 윈도우에서 열려고 할 경우 에디터에서 처리해주지 않으면 모두 문제가 발생한다.


리눅스에서 만든 문서는 리눅스에서 위와 같이 깨진다. 줄이 바뀌는 부분에 검은색 네모 안에 동그라미 표시 문자가 나타난다. 이 것은 "\n"을 의미하는 문자다. 윈도우는 "\n"을 위와 같은 문자로 표현해 준다. 


이를 해결하기 위해서 "\n"을 "\r\n"으로 바꿔주면 된다. 어떻게 바꿔줄 수 있을까?


사실 파이썬으로는 너무 간단하다. 바이너리 모드로 열어서 "\n"을 "\r\n"로 바꿔주기만 하면 된다.

위 코드를 실행한 결과 깔끔하게 개행이 처리되었다.

이를 응용하면 반대로 윈도우에서 만든 문서파일을 리눅스에서 제대로 읽을 수 있도록 만들 수 있다.

더 나아가 편집기를 만든다면 윈도우에서 만든 파일이든 리눅스에서 만든 파일이든 제대로 열리는 편집기도 만들 수 있을 것이다.

반응형