etc./StackOverFlow

후행 줄 바꿈을 제거하려면 어떻게 해야 합니까?

청렴결백한 만능 재주꾼 2021. 12. 21. 22:07
반응형

질문자 :RidingThisToTheTop


문자열이 개행이면 문자열의 마지막 문자를 제거하는 chomp 함수에 해당하는 Python은 무엇입니까?



rstrip() 메서드를 사용해 보세요( 문서 Python 2Python 3 참조 ).

 >>> 'test string\n'.rstrip() 'test string'

Python의 rstrip() 메서드 chomp 수행하는 것처럼 하나의 개행 문자가 아니라 모든 종류의 후행 공백을 제거합니다.

 >>> 'test string \n \r\n\n\r \n\n'.rstrip() 'test string'

개행만 제거하려면:

 >>> 'test string \n \r\n\n\r \n\n'.rstrip('\n') 'test string \n \r\n\n\r '

strip() , lstrip()strip() 메서드도 있습니다.

 >>> s = " \n\r\n \n abc def \n\r\n \n " >>> s.strip() 'abc def' >>> s.lstrip() 'abc def \n\r\n \n ' >>> s.rstrip() ' \n\r\n \n abc def'

Community Wiki

그리고 후행 줄 바꿈 문자 없이 줄을 가져오는 "파이썬 방식의" 방법은 splitlines()입니다.

 >>> text = "line 1\nline 2\r\nline 3\nline 4" >>> text.splitlines() ['line 1', 'line 2', 'line 3', 'line 4']

Ryan Ginstrom

EOL(end-of-line) 문자를 제거하는 표준 방법은 문자열 rstrip() 메서드를 사용하여 후행 \r 또는 \n을 제거하는 것입니다. 다음은 Mac, Windows 및 Unix EOL 문자의 예입니다.

 >>> 'Mac EOL\r'.rstrip('\r\n') 'Mac EOL' >>> 'Windows EOL\r\n'.rstrip('\r\n') 'Windows EOL' >>> 'Unix EOL\n'.rstrip('\r\n') 'Unix EOL'

'\r\n'을 rstrip에 대한 매개변수로 사용하면 '\r' 또는 '\n'의 후행 조합을 제거합니다. 이것이 위의 세 가지 경우 모두에서 작동하는 이유입니다.

이 뉘앙스는 드문 경우에 중요합니다. 예를 들어, 한 번은 HL7 메시지가 포함된 텍스트 파일을 처리해야 했습니다. HL7 표준에는 EOL 문자로 후행 '\r'이 필요합니다. 이 메시지를 사용하고 있던 Windows 시스템에 고유한 '\r\n' EOL 문자가 추가되었습니다. 따라서 각 줄의 끝은 '\r\r\n'처럼 보입니다. rstrip('\r\n')을 사용하면 내가 원하는 것이 아닌 전체 '\r\r\n'을 제거했을 것입니다. 이 경우 대신 마지막 두 문자를 잘라냈습니다.

Perl의 chomp 함수와 달리 이것은 문자열 끝에서 한 문자가 아닌 지정된 모든 문자를 제거합니다.

 >>> "Hello\n\n\n".rstrip("\n") "Hello"

Mike

rstrip은 문자열을 수정하지 않기 때문에 Perl의 chomp()와 똑같이 작동하지 않습니다. 즉, Perl에서:

 $x="a\n"; chomp $x

결과적으로 $x"a" 됩니다.

하지만 파이썬에서:

 x="a\n" x.rstrip()

x 의 값이 여전히 "a\n" 임을 의미합니다. x=x.rstrip() 조차도 항상 동일한 결과를 제공하지는 않습니다. 기껏해야 하나의 줄 바꿈이 아니라 문자열 끝에서 모든 공백을 제거하기 때문입니다.


Sameer Siruguri

다음과 같이 사용할 수 있습니다.

 import os s = s.rstrip(os.linesep)

rstrip("\n") 의 문제는 줄 구분 기호가 이식 가능한지 확인하려는 것입니다. "\r\n" 을 사용한다는 소문이 있습니다). 다른 문제는 rstrip 이 반복되는 공백을 제거한다는 것입니다. os.linesep 에 올바른 문자가 포함되기를 바랍니다. 위의 나를 위해 작동합니다.


Jamie

line = line.rstrip('\n') 사용할 수 있습니다. 이것은 문자열 끝에서 하나가 아닌 모든 개행을 제거합니다.


kiriloff

s = s.rstrip()

s 끝에 있는 모든 개행 문자를 제거합니다. rstrip 은 원래 문자열을 수정하는 대신 새 문자열을 반환하기 때문에 할당이 필요합니다.


slec

이것은 "\n" 줄 종결자에 대한 perl의 chomp(배열에서 동작 빼기)를 정확히 복제합니다.

 def chomp(x): if x.endswith("\r\n"): return x[:-2] if x.endswith("\n") or x.endswith("\r"): return x[:-1] return x

(참고: 'in place' 문자열을 수정하지 않으며, 추가 후행 공백을 제거하지 않으며, \r\n을 고려합니다)


Alien Life Form

"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '') >>> 'line 1line 2...'

또는 정규 표현식으로 항상 괴짜가 될 수 있습니다 :)

재미를!


mihaicc

스트립을 사용할 수 있습니다.

 line = line.strip()

데모:

 >>> "\n\n hello world \n\n".strip() 'hello world'

Hackaholic

rstrip은 많은 수준에서 chomp와 동일한 작업을 수행하지 않습니다. http://perldoc.perl.org/functions/chomp.html을 읽고 chomp가 실제로 매우 복잡하다는 것을 확인하십시오.

그러나 내 요점은 chomp가 최대 한 줄 끝을 제거하는 반면 rstrip은 최대한 많이 제거한다는 것입니다.

여기에서 rstrip이 모든 개행 문자를 제거하는 것을 볼 수 있습니다.

 >>> 'foo\n\n'.rstrip(os.linesep) 'foo'

다음과 같이 re.sub를 사용하여 일반적인 Perl chomp 사용법에 훨씬 더 가깝게 근사할 수 있습니다.

 >>> re.sub(os.linesep + r'\Z','','foo\n\n') 'foo\n'

ingydotnet

"foo".rstrip(os.linesep) 주의하십시오. Python이 실행되는 플랫폼의 개행 문자만 제거합니다. 예를 들어 Linux에서 Windows 파일의 행을 침팬지한다고 상상해보십시오.

 $ python Python 2.7.1 (r271:86832, Mar 18 2011, 09:09:48) [GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os, sys >>> sys.platform 'linux2' >>> "foo\r\n".rstrip(os.linesep) 'foo\r' >>>

Mike가 위에서 말한 것처럼 "foo".rstrip("\r\n")


Carlos Valiente

Python 문서 의 예는 단순히 line.strip() 합니다.

Perl의 chomp 함수는 문자열이 실제로 존재하는 경우에만 문자열의 끝에서 하나의 줄바꿈 시퀀스를 제거합니다.

process 가 개념적으로 이 파일의 각 줄에 유용한 작업을 수행하는 데 필요한 기능인 경우 Python에서 이를 수행할 계획은 다음과 같습니다.

 import os sep_pos = -len(os.linesep) with open("file.txt") as f: for line in f: if line[sep_pos:] == os.linesep: line = line[:sep_pos] process(line)

minopret

저는 Python으로 프로그래밍하지 않지만 python.org에서 python 2.2 이상에 대해 S.rstrip("\r\n")을 옹호 하는 FAQ를 발견했습니다.


Andrew Grimm

import re r_unwanted = re.compile("[\n\t\r]") r_unwanted.sub("", your_text)

user1151618

질문이 여러 줄 str 개체(oldstr)의 모든 줄 바꿈을 정리하는 것이라면 구분 기호 '\n'에 따라 목록으로 분할한 다음 이 목록을 새 str(newstr)에 결합할 수 있습니다.

newstr = "".join(oldstr.split('\n'))


Leozj

파일 객체에서 chomped 라인을 얻을 수 있는 것과 병행하여 in iterator를 통해 chomped 라인을 얻을 수 있는 것이 편리하다는 것을 알았습니다. 다음 코드로 그렇게 할 수 있습니다.

 def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it)

샘플 사용법:

 with open("file.txt") as infile: for line in chomped_lines(infile): process(line)

kuzzooroo

이전에 다른 답변의 의견에 게시한 답변에서 정규식 기반 답변을 버블링하고 있습니다. re str.rstrip 보다 이 문제에 대한 더 명확한 해결책이라고 생각합니다.

 >>> import re

하나 이상의 후행 개행 문자를 제거하려면 다음을 수행하십시오.

 >>> re.sub(r'[\n\r]+$', '', '\nx\r\n') '\nx'

모든 곳에서 줄 바꿈 문자를 제거하려면(후행뿐만 아니라):

 >>> re.sub(r'[\n\r]+', '', '\nx\r\n') 'x'

1-2개의 후행 개행 문자만 제거하려는 경우(즉, \r , \n , \r\n , \n\r , \r\r , \n\n )

 >>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r\n') '\nx\r' >>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r') '\nx\r' >>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n') '\nx'

\r\n 또는 \n 중 하나인 후행 줄 바꿈 문자를 번만 제거하고 그 이상은 제거하는 것이라고 생각합니다.

 >>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n\n', count=1) '\nx\n' >>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n\r\n', count=1) '\nx\r\n' >>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n', count=1) '\nx' >>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n', count=1) '\nx'

( ?: 는 비캡처 그룹을 생성하는 것입니다.)

(그런데이 것이 아닙니다 '...'.rstrip('\n', '').rstrip('\r', '') .이 스레드에 걸림돌 다른 사람에게 명확하게 전달되지 않을 수 않는 str.rstrip 같은 문자열, 그래서 가능한 한 후행 문자의 많은으로 스트립을 foo\n\n\n 의 가양 초래 foo 단일 후행 하나를 제거 후 다른 줄 바꿈을 유지하고 싶었 수도있는 반면.)


Taylor Edmiston

특별한 경우에 대한 해결 방법:

개행 문자가 마지막 문자인 경우(대부분의 파일 입력의 경우와 마찬가지로) 컬렉션의 모든 요소에 대해 다음과 같이 색인을 생성할 수 있습니다.

 foobar= foobar[:-1]

줄 바꿈 문자를 잘라냅니다.


Chij

perl의 chomp에 대한 완벽한 아날로그는 없는 것 같습니다. 특히, rstrip \r\n 과 같은 다중 문자 줄 바꿈 구분 기호를 처리할 수 없습니다. 그러나 분할선여기에서 지적한 대로 수행됩니다 . 다른 질문에 대한 내 대답 에 따라 조인분할선 s 에서 모든 줄 바꿈을 제거/교체할 수 있습니다.

 ''.join(s.splitlines())

다음은 정확히 하나의 후행을 제거합니다.


Community Wiki

s = '''Hello World \t\n\r\tHi There''' # import the module string import string # use the method translate to convert s.translate({ord(c): None for c in string.whitespace} >>'HelloWorldHiThere'

정규식 사용

 s = ''' Hello World \t\n\r\tHi ''' print(re.sub(r"\s+", "", s), sep='') # \s matches all white spaces >HelloWorldHi

\n,\t,\r 바꾸기

 s.replace('\n', '').replace('\t','').replace('\r','') >' Hello World Hi '

정규식 사용

 s = '''Hello World \t\n\r\tHi There''' regex = re.compile(r'[\n\r\t]') regex.sub("", s) >'Hello World Hi There'

조인으로

 s = '''Hello World \t\n\r\tHi There''' ' '.join(s.split()) >'Hello World Hi There'

user1464878

>>> ' spacious '.rstrip() ' spacious' >>> "AABAA".rstrip("A") 'AAB' >>> "ABBA".rstrip("AB") # both AB and BA are stripped '' >>> "ABCABBA".rstrip("AB") 'ABC'

user7121455

그냥 사용:

 line = line.rstrip("\n")

또는

 line = line.strip("\n")

이런 복잡한 건 필요 없어


Help me

우리가 일반적으로 만나는 세 가지 유형의 줄 끝이 있습니다: \n , \r\r\n . re.sub 의 다소 간단한 정규식, 즉 r"\r?\n?$" 는 모두 잡을 수 있습니다.

(그리고 우리는 그들을 모두 잡아야합니다 , 맞습니까?)

 import re re.sub(r"\r?\n?$", "", the_text, 1)

마지막 인수를 사용하여 chomp를 어느 정도 모방하여 대체되는 발생 수를 하나로 제한합니다. 예시:

 import re text_1 = "hellothere\n\n\n" text_2 = "hellothere\n\n\r" text_3 = "hellothere\n\n\r\n" a = re.sub(r"\r?\n?$", "", text_1, 1) b = re.sub(r"\r?\n?$", "", text_2, 1) c = re.sub(r"\r?\n?$", "", text_3, 1)

... 여기서 a == b == cTrue 입니다.


internetional

속도에 관심이 있고(문자열 목록이 너무 많다고 가정) 줄 바꿈 문자의 특성을 알고 있다면 문자열 슬라이싱이 실제로 rstrip보다 빠릅니다. 이것을 설명하기 위한 약간의 테스트:

 import time loops = 50000000 def method1(loops=loops): test_string = 'num\n' t0 = time.time() for num in xrange(loops): out_sting = test_string[:-1] t1 = time.time() print('Method 1: ' + str(t1 - t0)) def method2(loops=loops): test_string = 'num\n' t0 = time.time() for num in xrange(loops): out_sting = test_string.rstrip() t1 = time.time() print('Method 2: ' + str(t1 - t0)) method1() method2()

산출:

 Method 1: 3.92700004578 Method 2: 6.73000001907

Stephen Miller


이것은 Windows와 Linux 모두에서 작동합니다 (re 솔루션 만 찾고 있다면 re sub로 약간 비쌉니다)

 import re if re.search("(\\r|)\\n$", line): line = re.sub("(\\r|)\\n$", "", line)


Venfah Nazir

모든 것을 캐치:

 line = line.rstrip('\r|\n')

user4178860

출처 : http:www.stackoverflow.com/questions/275018/how-can-i-remove-a-trailing-newline

반응형