题 如何在Python中删除(chomp)尾随换行符?


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


1331
2017-11-08 18:25


起源


也可以看看 stackoverflow.com/questions/2572/... - Greg Hewgill
好吧,我已经重做了,所以人们不会给你太多标记:)欢迎来到Stack Overflow,除了像这样的一些奇怪的规则,这是一个非常友好和明智的地方! - Rich Bradshaw
@Sorin Sbarnea rstrip('\ n')与Python3一起使用。 - weakish
什么是“价值的最后一个角色”? chomp做什么:删除所有尾随换行符,或 一 尾随换行? - Ciro Santilli 新疆改造中心 六四事件 法轮功
Superset:任何字符串而不仅仅是换行符: stackoverflow.com/questions/1038824/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


试试这个方法 rstrip() (见文件 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'

1394
2017-11-09 05:52



我不是Python人,所以我没有答案,但Perl的chomp()实际上从最后删除了输入记录分隔符。这是关于Unixy事物的新线,但可能不同(例如Windows)并且它是可变的。有没有办法从字符串的末尾只删除一次该值? - brian d foy
brian d foy:Python没有像awk和Perl那样的输入记录分隔符。 - Peter Hosey
是否足够? >>>“test string \ r \ n”.rstrip(“\ n”)'test string \ r' - Andrew Grimm
@csde_rats,这不是真的:OS X使用 \n 像Unix那样的新行。 (在OS X之前,MacOS确实使用过 \r 作为行分隔符,但在10年前结束。) - skue
@briandfoy Python内置支持Universal换行符(仅在读取时,而不是在写入时)。您可以在“U”或“rU”模式下打开文件,然后无论Windows,Linux,Mac等等,在文本到达您的python代码时,任何样式的换行都已替换为“\ n”。看到: python.org/dev/peps/pep-0278 - AlcubierreDrive


而且我会说“pythonic”获取没有尾随换行符的行的方法是splitlines()。

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

139
2017-11-09 00:11



如果您使用fd.readlines()等,则不会。 - Dirk
注意: str.splitlines() 将许多字符视为换行符(不仅仅是 \r, \n) - jfs


剥离行尾(EOL)字符的规范方法是使用字符串rstrip()方法删除任何尾随\ n或\ n \ 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标准要求尾随'\ n'作为其EOL字符。我使用此消息的Windows机器附加了自己的'\ r \ n'EOL字符。因此,每行的结尾看起来像'\ r \ n \ r \ n'。使用rstrip('\ r \ n')会取消整个'\ r \ n \ n \ n',这不是我想要的。在这种情况下,我只是将最后两个字符切掉。

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

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

126
2017-11-28 17:31



请注意,现代Mac OS X应用程序使用\ n。只有最初为Mac OS编写的旧Carbon应用才使用\ r \ n。 - Peter Hosey
谢谢你的澄清。当然,rstrip('\ r \ n')在这种情况下仍然有效。 - Mike
还有 os.linesep,其中包含当前操作系统的EOL序列。 - Eli Collins
这是最好的答案:它 只要 剥离换行符,并为最常见的平台正确执行。 - kevinarpe
加+1使用 \n 和 \r - fechnert


请注意,rstrip的行为与Perl的chomp()完全不同,因为它不会修改字符串。也就是说,在Perl中:

$x="a\n";

chomp $x

结果是 $x 存在 "a"

但在Python中:

x="a\n"

x.rstrip()

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


96
2018-03-07 16:07



另外,strip()删除重复的字符,而chop / chomp只删除一个换行符 - kostmo
啊,是的,字符串是不可变的,谢谢提醒! - Brian Peterson


我可能会使用这样的东西:

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

我觉得这个问题 rstrip("\n") 是你可能想要确保行分隔符是可移植的。 (传闻有些过时的系统会使用 "\r\n")。另一个问题是 rstrip 将删除重复的空格。希望 os.linesep 将包含正确的字符。以上对我有用。


46
2018-05-13 16:41



但是,如果您尝试在Web应用程序中清理用户提交的内容,则无法使用此功能。用户内容可以来自任何来源,并包含任何换行符。 - apiguy
好的一点,除了您可能正在处理现代操作系统上的“外国”文件(来自过时的系统)。 - ChuckCottrill
还要记住,如果您正在以文本模式读取文件,这也不适用于Windows系统,因为尾随字符将始终转换为'\ n'。 - Mad Physicist


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


37
2018-03-09 08:02





s = s.rstrip()

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


28
2018-02-29 22:40





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

或者你可以随时使用regexps :)

玩的开心!


23
2017-11-21 04:29



这对我来说非常有用,我试图将带有行结尾的文本文件快速转换为一行文本。我是新手,所以不确定是否有更好的方法,但它有效,谢谢! (条带似乎只能从两端开始工作,而不是内部工作) - Steve Koch
为什么不使用一个替换语句,比如 .replace('\n|\r', '')? - Doorknob
@Doorknob不起作用 - mihaicc
为了防止其他人想要使用@DoorknobofSnow的想法,使用正则表达式模块只是一个小小的改动: import re  re.sub('\n|\r', '', '\nx\n\r\n') ==> 'x'。 - Taylor Edmiston
使用这个和正则表达式技术@TaylorEdmiston提到应该是正确的答案。 - Bhargav


你可以使用strip:

line = line.strip()

演示:

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

19
2018-04-27 11:43



试过这个解决方案,但它剥离了该行中的前导空白。 - Tarik
@Tarik你可以使用rstrip - Hackaholic
rstrip将删除所有尾随空格,而chomp只删除最多一个换行符。 - Flimm


小心 "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'
>>>

使用 "foo".rstrip("\r\n") 相反,正如迈克上面所说。


18
2017-10-23 01:32



另一件需要注意的是,它不会删除最多一个换行符,而是删除所有换行符 chomp。 - Flimm


一个 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)

18
2018-04-23 12:42



最后,答案只能删除它 一旦 (就像实际的chomp ...)并且是OS便携式的! - Ciro Santilli 新疆改造中心 六四事件 法轮功