chomp문자열이 줄 바꿈 인 경우 문자열의 마지막 문자를 제거하는 Perl 함수 와 동등한 Python은 무엇입니까 ?
open()적합한 'newline = ...' 매개 변수 가 있는 파일 을 잊어 버린 경우 (일반적인 개행 지원), 명시 적으로 제거하지 않아도됩니다.
chomp문자열이 줄 바꿈 인 경우 문자열의 마지막 문자를 제거하는 Perl 함수 와 동등한 Python은 무엇입니까 ?
open()적합한 'newline = ...' 매개 변수 가 있는 파일 을 잊어 버린 경우 (일반적인 개행 지원), 명시 적으로 제거하지 않아도됩니다.
답변:
방법을 시도 rstrip()하십시오 (doc Python 2 및 Python 3 참조 )
>>> 'test string\n'.rstrip()
'test string'
Python의 rstrip()메소드 는 Perl과 같이 하나의 줄 바꿈이 아니라 기본적으로 모든 종류의 후행 공백을 제거 합니다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 '
방법 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'
\nUnix처럼 개행을 사용 합니다. (OS X 이전에는 MacOS가 \r줄 구분 기호로 사용되었지만 10 년 전에 끝났습니다.)
.strip()문자열을 변경하지 않습니다 (불변 문자열과 관련이있을 수 있음). 커맨드 라인에 없다면, 당신은 원할 것입니다"string = string.strip()"
그리고 줄 바꿈 문자없이 줄을 얻는 "pythonic"방법은 splitlines ()라고 말합니다.
>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
줄 끝 (EOL) 문자를 제거하는 정식 방법은 문자열 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'
rstrip의 매개 변수로 '\ r \ n'을 사용하면 '\ 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"
os.linesep현재 OS에 대한 EOL 시퀀스를 포함하는 도 있습니다.
\n및\r
rstrip은 문자열을 수정하지 않기 때문에 Perl의 chomp ()와 똑같이 작동하지 않습니다. 즉, Perl에서 :
$x="a\n";
chomp $x
결과 $x것 "a".
그러나 파이썬에서는 :
x="a\n"
x.rstrip()
의 값 x이 여전히 임을 의미합니다 "a\n". 심지어 x=x.rstrip()줄 바꿈이 아니라 문자열 끝에서 모든 공백을 제거하기 때문에 항상 동일한 결과를 제공하지는 않습니다.
나는 이런 식으로 사용할 수 있습니다 :
import os
s = s.rstrip(os.linesep)
문제 rstrip("\n")는 아마도 라인 분리기가 이식 가능한지 확인하고 싶을 것입니다. (일부 구식 시스템은 사용한다는 소문이 있습니다 "\r\n"). 다른 단점은 rstrip반복되는 공백을 제거 한다는 것입니다. 바라건대 os.linesep올바른 문자가 포함 되기를 바랍니다 . 위의 내용은 저에게 효과적입니다.
rstrip('\r\n')와 동일 하고 rstrip()스트립 하기 때문에 여전히 작동합니다 .
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'
또는 항상 정규 표현식으로 괴짜를 얻을 수 있습니다 :)
재미 있어요!
.replace('\n|\r', '')? 와 같은 하나의 replace 문을 사용하지 않는 이유는 무엇 입니까?
import re re.sub('\n|\r', '', '\nx\n\r\n')==> 'x'.
스트립을 사용할 수 있습니다 :
line = line.strip()
데모:
>>> "\n\n hello world \n\n".strip()
'hello world'
rstrip은 많은 수준에서 chomp와 동일한 기능을 수행하지 않습니다. http://perldoc.perl.org/functions/chomp.html을 읽고 chomp가 실제로 매우 복잡하다는 것을 알 수 있습니다.
그러나 내 주요 요점은 chomp가 최대 1 줄 끝을 제거하는 반면 rstrip은 가능한 한 많은 것을 제거한다는 것입니다.
다음은 모든 줄 바꿈을 제거하는 rstrip을 볼 수 있습니다.
>>> 'foo\n\n'.rstrip(os.linesep)
'foo'
다음과 같이 rel을 사용하여 일반적인 Perl chomp 사용법을 훨씬 더 가깝게 추정 할 수 있습니다.
>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'
주의 사항 "foo".rstrip(os.linesep): 파이썬이 실행되는 플랫폼의 줄 바꿈 문자 만 꽉 채우게됩니다. 예를 들어 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'
>>>
"foo".rstrip("\r\n")Mike가 위에서 말한 것처럼 대신 사용하십시오 .
chomp입니다.
파이썬 문서 의 예제는 단순히을 사용합니다 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)
import re
r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)
파일 객체에서 촘촘한 줄을 얻는 방법과 평행하게 반복자를 통해 촘촘한 줄을 얻는 것이 편리하다는 것을 알았습니다. 다음 코드를 사용하면됩니다.
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)
operator.methodcaller와 map( itertools.imap파이썬 레벨 생성기 코드를 피하고 (함으로써하지만 틀림없이 내가 / O 오버 헤드 작은 이익을 마스크 가능성이 조금 더 빠른 실행), 당신은 C 층이 일을 밀어 수 Py2에) for line in map(operator.methodcaller('rstrip', '\r\n'), infile):. 여전히로 간주 될 수 있습니다 def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it).
특수한 경우에 대한 해결 방법 :
개행 문자가 마지막 문자 인 경우 (대부분의 파일 입력의 경우와 마찬가지로) 컬렉션의 모든 요소에 대해 다음과 같이 색인을 생성 할 수 있습니다.
foobar= foobar[:-1]
줄 바꿈 문자를 잘라냅니다.
perl의 chomp에 대한 완벽한 아날로그가없는 것 같습니다 . 특히 rstrip은와 같은 여러 문자 줄 바꿈 구분자를 처리 할 수 없습니다 \r\n. 그러나 분할 선 은 여기에서 지적한대로 입니다. 다른 질문에 대한 내 대답 에 따라 조인 과 분할 선 을 결합 하여 문자열에서 모든 줄 바꿈을 제거 / 교체 할 수 있습니다 s.
''.join(s.splitlines())
다음은 정확히 하나의 후행 줄 바꿈을 제거합니다 (나는 생각하는 것처럼). 분리선에 True대한 keepends인수로 전달 하면 구분 기호가 유지됩니다. 그런 다음 마지막 "줄"에서 구분 기호를 제거하기 위해 분할 선이 다시 호출됩니다.
def chomp(s):
if len(s):
lines = s.splitlines(True)
last = lines.pop()
return ''.join(lines + last.splitlines())
else:
return ''
다른 답변의 의견에 앞서 게시 한 답변에서 정규 표현식 기반 답변을 버블 링하고 있습니다. 사용 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당신이 보존 싶었을 수있는 반면 하나의 후행 줄을 제거한 후 다른 줄 바꿈.)
r'\r?\n$'있습니다. 정규식 엔진은 교체 최적화에 더 많은 시간이 걸리기 때문에 더 효율적일 수 있습니다. 또한 여러 번이 작업을 수행하는 경우 식에 앞서 (특히 다른 re용도 와 혼용하는 경우) 훨씬 빠르며 컴파일 된 정규식 객체 re.compile의 sub메서드 를 사용하십시오 . 모듈 함수는 파이썬 수준이며 컴파일 된 정규 표현식에 대한 캐시를 먼저 확인한 다음 (없는 경우 작성 / 캐싱) 일치하는 메소드를 호출하십시오. 해당 조회를 건너 뛰면 도움이됩니다.
\n직접 일치 시키려고하므로 \Zover 를 사용하고 싶을 수도 있습니다 $(또는 문자열 끝에서 개행 직전에 암시 적으로 일치 할 수 \r?$있기 때문에 $match).
>>> ' spacious '.rstrip()
' spacious'
>>> "AABAA".rstrip("A")
'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
''
>>> "ABCABBA".rstrip("AB")
'ABC'
"\r\n"예를 들어이 : ' spacious \n\r\n\r \n\n'.rstrip()생산' spacious'
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'
일반적으로 발생하는 세 가지 유형의 줄 끝이 있습니다. \n,\r 및 \r\n. 의 간단한 정규 표현식 re.sub, 즉r"\r?\n?$" , 그들 모두를 잡을 수있다.
(그리고 우리 모두를 잡아야 해요 , 맞습니까?)
import re
re.sub(r"\r?\n?$", "", the_text, 1)
마지막 논증으로, 우리는 발생 빈도를 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 == c있습니다 True.
rstrip("\r\n")포괄입니다. 시도하십시오 print(text_2.rstrip('\r\n')).
str.rstrip()문제 가 해결되면 사실 입니다. 어떤 요구 사항에 따라 다릅니다. 이 솔루션은 특히 방금 마지막을 제거해야 할 때 경우에한다 "\n", "\r"또는 "\r\n"전부는 아니지만 그들 (복수가있는 경우 "\n"문자열). 다른 문자열을 re.sub(r"\r?\n?$", "", text_1, 1)반환 "hellothere\n\n"하고 text_1.rstrip("\r\n")반환 "hellothere"합니다.
str.strip()전부입니다. 때로는 매우 문제입니다.
속도에 관심이 있고 (예를 들어, 문자열 목록이 충분하지 않음) 줄 바꿈 문자의 특성을 알고 있으면 문자열 슬라이싱이 실제로 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
method1방금 마지막 문자, 무엇에 상관없이 잘라낸하는 는 먼저, 만약 문자열의 끝이 원하지 않는 문자가 포함 된 일부가 발견 된 경우에만 그들을 갈비를. 문자를 확인 하고 agin을 테스트하십시오! method2.rstrip()method1
모두 잡아라 :
line = line.rstrip('\r|\n')
rstrip정규 표현식을 사용하지 않습니다. "hi|||\n\n".rstrip("\r|\n")반환"hi"