2023년 7월 11일 화요일

'\r' CR(Carriage Return) 과 print in python

 '\r' 때문에 디버깅 고생했던 스토리 입니다.

python 에서 외부 process를 call 하고 리턴값을 가져다가 라인별로 처리를 하는 SW 를 구현 하던중 print 출력이 이상하게 나오는 증상을 발견하였습니다.

간략하게 정리해보자면 복잡하지만 간단하게 핵심 내용만으로 구성하였습니다.


sub_ret = 'hello\r\nddd ddd\r\nkkkk aaa\r\nlalala \r\n'

print(sub_ret)

sub_ret 변수는 리턴을 받은 값이고 대충 위와 같은 형태를 가지고 있었습니다. (Windows 환경)

Microsoft 사의 Windows 는 CRLF (\r\n) 을 기본으로 사용하며

Unix/Linux 에서는 LF (\n) 만으로 줄바꿈을 사용합니다.

(Mac의 경우 다릅니다.)

실행시보면 아래와 같은 형태로 출력이 됩니다.


hello
ddd ddd
kkkk aaa
lalala

여기에서 라인단위의 처리를 위해 \n 을 기준으로 line을 분리하여 다음과 같이 처리하였습니다.


sub_ret = 'hello\r\nddd ddd\r\nkkkk aaa\r\nlalala \r\n'

n_split = sub_ret.split("\n")
for nn in n_split:
print(nn)

여기까지 출력해보면 동일하게 정상적으로 출력이 됩니다.


hello
ddd ddd
kkkk aaa
lalala

그런데 조금만 변경해서 아래와 같이 nn 앞 뒤에 뭔가 출력하려고 했을때 이상하게 출력되었습니다.


sub_ret = 'hello\r\nddd ddd\r\nkkkk aaa\r\nlalala \r\n'

n_split = sub_ret.split("\n")
for nn in n_split:
print("["+nn+"]")

실행화면


]
]
]
]
[]

위 내용을 디버깅한다고 오래 걸렸습니다.

이것이 처음에 말한 '\r'(CR) 때문이었고 CR : Carriage Return (\r) 현재 커서를 줄 바꿈 없이 가장 앞으로 옮기는 동작으로 hello 출력된 위치의 처음으로 가서 "]" 를 출력하게 되는데 이때 기존에 출력된 글자들을 지우는 경우가 있어서 위와 같이 되었습니다.

출력시 CR 값이 존재하는지 꼭 확인해보세요. 의도와 다르게 출력될 수 있습니다.


댓글 없음:

댓글 쓰기