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'
\n
Unix처럼 개행을 사용 합니다. (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
직접 일치 시키려고하므로 \Z
over 를 사용하고 싶을 수도 있습니다 $
(또는 문자열 끝에서 개행 직전에 암시 적으로 일치 할 수 \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"