답변:
inputString.splitlines()
각 항목과 함께 목록을 제공합니다.이 splitlines()
방법은 각 줄을 목록 요소로 분할하도록 설계되었습니다.
''.splitlines() == []
하지, ['']
처럼 ''.split('\n')
.
다른 사람들이 말했듯이 :
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']
inputString.split(os.linesep)
플랫폼 별 라인 터미네이터를 사용합니다.
사용하십시오str.splitlines()
.
splitlines()
와 달리 개행을 올바르게 처리합니다 split("\n")
.
또한 True
인수 와 함께 호출 될 때 분할 결과에 개행 문자를 선택적으로 포함시키는 @efotinis가 언급 한 이점이 있습니다 .
사용하지 말아야 할 이유에 대한 자세한 설명 split("\n")
:
\n
Python에서는 실행하는 플랫폼과 독립적으로 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 시스템에서 사용 하면 원하지 않는 동작이 발생합니다. 또한 소켓과 같은 다른 소스와는 다른 줄 바꿈이있는 문자열을 처리하는 것은 드문 일이 아닙니다.
splitlines
에서 나뉩니다 . 예를 들어 유닉스에서 윈도우 파일을 읽을 때 실패합니다split(os.linesep)
이 특별한 경우에는 과잉이 될 수 있지만 다른 옵션은 StringIO
파일과 같은 객체를 만드는 데 사용 됩니다
for line in StringIO.StringIO(inputString):
doStuff()
str.split
은 메모리를 할당 할 필요 가 없다는 것입니다 (문자열을 내부에서 읽습니다). 단점은 (약 50x) 사용하면 속도StringIO
가 훨씬 느리다 는 것입니다 . cStringIO
그러나을
원래 게시물은 일부 행 (일부 조건에 해당되는 경우)과 다음 행을 인쇄하는 코드를 요청했습니다. 내 구현은 다음과 같습니다.
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()