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

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

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

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

for line in inputString:
    doStuff()



답변

inputString.splitlines()

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


답변

다른 사람들이 말했듯이 :

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']


답변

사용하십시오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 시스템에서 사용 하면 원하지 않는 동작이 발생합니다. 또한 소켓과 같은 다른 소스와는 다른 줄 바꿈이있는 문자열을 처리하는 것은 드문 일이 아닙니다.


답변

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

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


답변

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

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])


답변

@ 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()


답변