여러 줄로 된 줄을 여러 줄로 나누려면 어떻게합니까?


287

각 줄에서 작업을 수행하려는 여러 줄 문자열 리터럴이 있습니다.

inputString = """Line 1
Line 2
Line 3"""

나는 다음과 같은 것을하고 싶다 :

for line in inputString:
    doStuff()

답변:


437
inputString.splitlines()

각 항목과 함께 목록을 제공합니다.이 splitlines()방법은 각 줄을 목록 요소로 분할하도록 설계되었습니다.


12
+1. 줄 구분 기호를 명시 적으로 엉망으로 만들지 않기 때문에 이것이 허용 된 솔루션보다 좋습니다. 그것은 모두 전용 API 메소드와 함께 작동합니다!
lpapp

12
@ lpapp, 전적으로 동의합니다. splitlines ()는 split ( '\ n')보다 의미 적으로 (그리고 기능적으로 범용 줄 바꾸기를 사용하고 후행 빈 줄을 생략하기 때문에) 기능적입니다. 당시 (2008) 나는 초보자 Pythonista 였고 grepping했지만 스크립트에서 나도 거의 독점적으로 splitlines ()를 사용하고 있음을 보여줍니다. 따라서 104 점의 답변 ( * sob ... * )을 삭제하고 대신 이것을 승인합니다.
efotinis

18
이것은 또한하게 ''.splitlines() == []하지, ['']처럼 ''.split('\n').
rightfold

198

다른 사람들이 말했듯이 :

inputString.split('\n')  # --> ['Line 1', 'Line 2', 'Line 3']

이것은 위와 동일하지만 문자열 모듈의 기능은 더 이상 사용되지 않으므로 피해야합니다.

import string
string.split(inputString, '\n')  # --> ['Line 1', 'Line 2', 'Line 3']

또는 각 행에 구분 순서 (CR, LF, CRLF)를 포함 시키려면 인수 splitlines와 함께 메소드를 사용하십시오 True.

inputString.splitlines(True)  # --> ['Line 1\n', 'Line 2\n', 'Line 3']

12
이것은 '\ n'을 줄 종결 자로 사용하는 시스템에서만 작동합니다.
Jeremy Cantrell

20
@Jeremy : 삼중 인용 문자열 리터럴은 플랫폼에 관계없이 항상 '\ n'EOL을 사용합니다. 따라서 텍스트 모드에서 파일을 읽습니다.
efotinis

16
inputString.split(os.linesep)플랫폼 별 라인 터미네이터를 사용합니다.
제임스

10
이 답변이 너무 찬란한 것이 이상합니다. 하드 코딩 '\ n'은 나쁜 생각이지만, 그 대신 os.linesep를 사용하더라도 Linux에서 Windows 줄 끝과 그 반대의 문제가 발생합니다. 아마 덜 일반적으로 사용하는 방법은 ...
lpapp

4
차선의 방법, 더 이상 사용되지 않는 방법 및 최적의 방법의 중복 변형의 조합.
jwg

50

사용하십시오str.splitlines() .

splitlines()와 달리 개행을 올바르게 처리합니다 split("\n").

또한 True인수 와 함께 호출 될 때 분할 결과에 개행 문자를 선택적으로 포함시키는 @efotinis가 언급 한 이점이 있습니다 .


사용하지 말아야 할 이유에 대한 자세한 설명 split("\n"):

\nPython에서는 실행하는 플랫폼과 독립적으로 Unix 줄 바꿈 (ASCII 10 진수 코드 10)을 나타냅니다. 그러나 줄 바꿈 표현은 플랫폼에 따라 다릅니다 . Windows에서는 \n두 문자 CR이며 LF(ASCII 10 진수 코드 13 및 10, AKA \r\n), 최신 Unix (OS X 포함)에서는 단일 문자 LF입니다.

print예를 들어 플랫폼과 일치하지 않는 줄 끝이있는 문자열이 있어도 올바르게 작동합니다.

>>> print " a \n b \r\n c "
 a 
 b 
 c

그러나 "\ n"으로 명시 적으로 분할하면 플랫폼에 따라 동작이 발생합니다.

>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']

을 사용하더라도 os.linesep플랫폼의 개행 구분 기호에 따라 분할되며 다른 플랫폼에서 작성된 텍스트를 처리하거나 베어를 사용하면 실패합니다 \n.

>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']

splitlines 이 모든 문제를 해결합니다.

>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']

텍스트 모드에서 파일을 읽으면 파이썬을 \n플랫폼의 개행 표현으로 변환하므로 개행 표현 문제가 부분적으로 완화 됩니다. 그러나 텍스트 모드는 Windows에만 존재합니다. Unix 시스템에서는 모든 파일이 이진 모드로 열리므로 split('\n')Windows 파일이있는 UNIX 시스템에서 사용 하면 원하지 않는 동작이 발생합니다. 또한 소켓과 같은 다른 소스와는 다른 줄 바꿈이있는 문자열을 처리하는 것은 드문 일이 아닙니다.


플랫폼 별 비트를 피하기 위해 split (os.linesep)을 사용할 수도 있기 때문에 비교는 불공평합니다.
lpapp

6
@lpapp 메모는 모든 줄 끝 splitlines에서 나뉩니다 . 예를 들어 유닉스에서 윈도우 파일을 읽을 때 실패합니다split(os.linesep)
goncalopp

1
필자의 경우 분할 선을 사용하는 또 다른 이유는 감사합니다. 나는 +1을 주었다. 나는 개인적으로 귀하의 답변에 의견의 정보를 통합 할 것입니다.
lpapp

20

이 특별한 경우에는 과잉이 될 수 있지만 다른 옵션은 StringIO파일과 같은 객체를 만드는 데 사용 됩니다

for line in StringIO.StringIO(inputString):
    doStuff()

예, 이것은 가장 관용적이고 가장 Python-ic 방식입니다.
상자성 크로와상

4
와 비교할 때이 방법의 장점 str.split메모리를 할당 할 필요없다는 것입니다 (문자열을 내부에서 읽습니다). 단점은 (약 50x) 사용하면 속도StringIO훨씬 느리다 는 것입니다 . cStringIO그러나을
goncalopp

무엇보다 2 배 더 빠릅니까?
Irina Rapoport

1
@IrinaRapoport, cStringIO는 StringIO보다 2 배 빠릅니다
iruvar

1

원래 게시물은 일부 행 (일부 조건에 해당되는 경우)과 다음 행을 인쇄하는 코드를 요청했습니다. 내 구현은 다음과 같습니다.

text = """1 sfasdf
asdfasdf
2 sfasdf
asdfgadfg
1 asfasdf
sdfasdgf
"""

text = text.splitlines()
rows_to_print = {}

for line in range(len(text)):
    if text[line][0] == '1':
        rows_to_print = rows_to_print | {line, line + 1}

rows_to_print = sorted(list(rows_to_print))

for i in rows_to_print:
    print(text[i])

0

@ 1_CR의 답변에 더 많은 충돌이 필요하고 그의 답변을 늘리고 싶기 때문에 주석에 적절한 코드 텍스트 형식이 있기를 바랍니다. 어쨌든, 그는 나를 다음과 같은 기술로 이끌었습니다. 사용 가능한 경우 cStringIO를 사용합니다 (그러나 참고 : cStringIO와 StringIO는 동일 하지 않습니다 .cStringIO를 서브 클래스 화 할 수 없기 때문에 내장되어 있습니다 ...하지만 기본 작업의 경우 구문이 동일 하므로이 작업을 수행 할 수 있습니다 ) :

try:
    import cStringIO
    StringIO = cStringIO
except ImportError:
    import StringIO

for line in StringIO.StringIO(variable_with_multiline_string):
    pass
print line.strip()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.