rstrip - python trim \n




如何删除(chomp)Python中的尾随换行符? (17)

Python文档中的一个例子就是使用line.strip()

Perl的chomp函数仅在字符串实际存在时才从字符串末尾移除一个换行序列。

下面是我计划如何在Python中实现这一点,如果process在概念上是我需要的功能,以便从该文件中为每行执行一些有用的操作:

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)

什么是Perl的chomp函数的Python等价物,如果它是换行符,它将删除字符串的最后一个字符?


你可以使用line = line.rstrip('\n') 。 这将从字符串的末尾剥离所有换行符,而不仅仅是一个。


剥离行尾(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'

使用'\ r \ n'作为rstrip的参数意味着它会去掉任何'\ r'或'\ n'的尾部组合。 这就是为什么它在上述所有三种情况下都有效。

这种细微差别很重要。 例如,我曾经处理过一个包含HL7消息的文本文件。 HL7标准要求在尾部的'\ r'作为其EOL字符。 我使用此消息的Windows机器上附有其自己的'\ r \ n'EOL字符。 因此,每行的结尾看起来像'\ r \ r \ n'。 使用rstrip('\ r \ n')会将整个'\ r \ r \ n'取下来,这不是我想要的。 在这种情况下,我只是将最后两个字符切掉。

请注意,与Perl的chomp函数不同,这将剥离字符串末尾的所有指定字符,而不仅仅是一个:

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

只需使用:

line = line.rstrip("\n")

要么

line = line.strip("\n")

你不需要任何这些复杂的东西


如果你关心速度(比如你有一串串字符串)并且你知道换行字符的性质,字符串切片实际上比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

如果您的问题是清理多行str对象(oldstr)中的所有换行符,则可以根据分隔符'\ n'将其拆分为列表,然后将此列表加入到新的str(newstr)中。

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


尝试方法rstrip() (请参阅文档Python 2Python 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'

我不用Python编程,但是我在python.org上发现了一个FAQ ,它提倡使用python 2.2或更高版本的S.rstrip(“\ r \ n”)。


我会说“pythonic”的方式来获得没有拖尾换行符的行是splitlines()。

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

我发现能够通过迭代器获得经过裁剪的线条是很方便的,与从文件对象中获得未经裁剪的线条的方式平行。 您可以使用以下代码来完成此操作:

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)

我正在冒充我基于正则表达式的答案,这是我之前在另一个答案的评论中发布的答案。 我认为使用restr.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尽可能多地str.rstrip尾随字符,因此像foo\n\n\n这样的字符串会导致foo的误判,而您可能希望在删除单个尾随后保留其他新行。)


抓住一切:

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

请注意,rstrip并不像Perl的chomp()那样动作,因为它不会修改字符串。 就是说,在Perl中:

$x="a\n";

chomp $x

导致$x"a"

但在Python中:

x="a\n"

x.rstrip()

将意味着x的值仍然"a\n" 。 即使x=x.rstrip()并不总是给出相同的结果,因为它从字符串的末尾x=x.rstrip()所有空白,而不是最多只有一个换行符。


这将为“\ n”行结束符精确复制perl的chomp(减去数组上的行为):

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

(注意:它不会修改字符串'in place';它不会去除多余的尾部空白;占用\ r \ n)


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

或者你可以随时使用正则表达式来获得更好的效果:)

玩的开心!


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

s = s.rstrip()

将删除字符串s末尾的所有换行符。 因为rstrip返回一个新字符串,而不是修改原始字符串,所以需要进行分配。





trailing