파이썬, 빈 줄 사이의 줄 연결

반응형

방법

one
two

three
four
five

six

seven
eight

텍스트 파일에 다음과 같이 줄이 형성되어 있다. 여기서 연속적인 줄들을 합쳐야 하고 다른 줄과 빈 줄은 나눠야 한다.

one two

three four five

six

seven eight
['\n', '\n', '\n', 'EMM - Freedom', 'MrSuicideSheep', '\n'] 

비슷한 여러 질문들에서 같은 답변을 봤었지만 결과는 동일 했다. 내가 예상하는 결과를 얻으려면 다음 예상 되는 모든 단어에서 \n 을 제거 해야 한다. 하지만 이 방법은 별로 좋지 못한 방법이다. 

모든 것을 file.read() 함수를 통해 단일 문자열로 읽을 수 있다. 그리고 줄바꿈을 의미하는 코드에 분할을 시도할 수 있다. 이 코드는 나중에 교체도 가능하다. 하지만 줄바꿈이 들어간 빈 줄에 공백이나 탭이 있으면 문제가 될 수 있다. 

text = '''one
two

three
four
five

six

seven
eight'''

data = text.split('\n\n')
data = [text.replace('\n', ' ') for text in data]

print(data)

결과

['one two', 'three four five', 'six', 'seven eight']

 

list 로 작업 해야하는 경우 list에서 모든 문자열을 연결하고 이전 코드를 사용할 수 있지만 빈 줄을 만드는 문제를 사용하면 regex 를 통해서 변환해야 한다. 다음과 같이 코드를 사용할 수 있다. 이 과정에서 io.StringIO 를 사용한다. 

 

text = '''one
two

three
four
five

six



seven
eight'''

import io

lines = io.StringIO(text).readlines()
print(lines)

results = []
row = []

for line in lines:
    line = line.rstrip()
    if line:
        #if not row:
        #    results.append('\n')
        row.append(line)
    else:
        if row:
            results.append(' '.join(row))
            row = []

# for last element this code has to be after loop
if row:
    results.append(' '.join(row))
    row = []

print(results)

print('\n\n'.join(results))

 

결과 

['one\n', 'two\n', '\n', 'three\n', 'four\n', 'five\n', '\n', 'six\n', '\n', '\n', '\n', 'seven\n', 'eight']

['one two', 'three four five', 'six', 'seven eight']

one two

three four five

six

seven eight

 

언 커맨트 라인 if not row: results.append('\n') 을 사용하면 다음 처럼 된다. 

['\n', 'one two', '\n', 'three four five', '\n', 'six', '\n', 'seven eight']

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유