본문 바로가기

IT/파이썬 Python

[파이썬] 윈도우 파이썬 스크립트로 리눅스/유닉스 파일 쓰기

반응형

실무 환경에서, 가끔씩 윈도우 서버에서 Python script를 통해 리눅스 / 유닉스 서버에서 사용할 파일을 생성해야 할 때가 있습니다.


알고 계시겠지만 OS에 따라서 행바꿈 (개행) 을 나타내는 특수문자 (데이터 바이트) 가 다릅니다.



DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13


저는 맥 환경을 사용하지는 않기 때문에 주로 윈도우와 리눅스 환경에서의 변환이 필요한데요, 윈도우 파이썬에서 파일을 쓰면 "\n" 을 입력해도 파이썬이 자동으로 "\r\n" 으로 변환을 시켜 버립니다.

아마도 코드를 변경할 필요 없이 윈도우 / 리눅스 모두에서 바로 사용할 수 있도록 배려한 부분인 것 같은데요,

저처럼 리눅스에서 파일을 써야 하는 경우 \r\n을 다시 \n 으로 변환해야 하는 불편함이 있을 수 있죠.


그래서 처음부터 파이썬 스크립트에서 리눅스 형식으로 , 개행문자를 \n만 사용하도록 하는 방법이 없나 찾아보니 역시 있더군요.

항상 구글 검색을 하면 상위에 노출되는 스택오버플로닷컴에서 좋은 답변을 찾았습니다.

(링크 : http://stackoverflow.com/a/23434608/994153 )


위 링크에 잘 설명되어 있지만, 크게 2가지 방법이 있습니다.


1. 파일을 open할 때, 바이너리 모드로 open하면 \n 을 \r\n으로 변환하지 않음

  --> 이 방법은 Python3에서는 사용할 수 없다고 합니다. 하지만 저는 Python 2.7을 사용하므로 이 방법을 선택했고 문제없이 잘 작동 합니다.


f = open('file.txt', 'wb')    # note the 'b' meaning binary


2. open 대신에 io.open을 사용, newline='' 인자를 적용

>  --> Python 2, 3 모두에 사용 가능하다고 하는데 제 Python 2.7에서는 무슨 이유인지 잘 작동하지 않더군요. Python3 라면 그냥 open 구문을 써도 newline='' 를 사용할 수 있다고 합니다.


import io
f = io.open('file.txt', 'w', newline='')   
# newline='' means don't convert \n


반응형