본문 바로가기
CS/Python

Python 개행문자 지우는 방법, strip 과 replace

by Warehaus 2021. 7. 8.

개요

Python 으로 아래처럼 hostfile을 읽어서 특정 조건에 맞는 값만 새롭게 파일을 쓰는 코드를 만들었는데, 새로 쓰는 파일에는 개행이 아니라 한 라인에 스페이스로 구분을 둬야 했다.

그래서 파일을 읽고 개행문자를 지우는 코드를 작성하게 되어서 기록을 남긴다.

 

기존 코드


hostfile

호스트 이름이 나열되어 있다. 실제 호스트는 이렇게 이름짓지 않는다. 그저 예시일 뿐이다.

t1
t2
t3
t4
c3
c4
c5

python code

import os

with open("hostfile", "r") as f:
    lines = f.readlines()

    with open( "newhost", "w" ) as nf:
        for l in lines:
            if 't' in l:
                    nf.write( l )

파일을 읽어서 t 문자가 있는 host만 newhost 파일에 쓴다.

newhost 파일을 읽어보면 아래와 같이 나온다. 그런데 개행이 아니라, space를 구분자로 두고싶다.

t1
t2
t3
t4

 

개선 코드


readline으로 읽어들인 값을 출력해보면 아래와 같이나온다.

['t1\n', 't2\n', 't3\n', 't4\n', 'c3\n', 'c4\n', 'c5\n']

각 항목의 개행문자를 지워줘야 newhost 파일에서 개행이 되지 않을 것이다.

이를 위해서 strip 함수를 사용했다. 여기서 주의할 점은 strip한 결과를 다시 대입해야 한다는 것이다.

import os

with open("hostfile", "r") as f:
    lines = f.readlines()

    with open( "newhost", "w" ) as nf:
        for l in lines:
            # '\n' will be removed
            l = l.strip()

            if 't' in l:
                nf.write( l )

 newhost는 다음과 같이 출력된다.

t1t2t3t4

이제 개행을 없애는 방법을 알았으니 space 만 넣어주면 된다.

import os

with open("hostfile", "r") as f:
    lines = f.readlines()

    with open( "newhost", "w" ) as nf:
        for l in lines:
            # '\n' will be removed and put space after it.
            l = l.strip() + " "

            if 't' in l:
                nf.write( l )

결과는 다음과 같이 원하는 대로 나온다.

t1 t2 t3 t4

사실 strip 을 알고는 있었지만 replace 를 이용하는 것도 되지 않을까 생각을 했다.

아래처럼 말이다.

import os

with open("hostfile", "r") as f:
    lines = f.readlines()

    with open( "newhost", "w" ) as nf:
        for l in lines:
            # '\n' will be removed and put space after it.
            # l =   l.strip() + " "
            l = l.replace("\n", "") + " "

            if 't' in l:
                nf.write( l )

역시 생각했던 대로 잘 된다. :)

그래도 나는 이 경우에는 strip 이 더 보기 좋아서 stript만 쓰기로 했다.

차이가 있다면 strip은 공백도 제거하니까( 문자열 내 공백이 아니라 좌 우 끝단의 공백이다)

정말 개행만 지우고 싶다면 replace가 더 적합 한 경우가 있을지도 모르겠다.