2012

How can I remove the last character of a string if it is a newline?

"abc\n"  -->  "abc"
John Smith
  • 7,243
  • 6
  • 49
  • 61
  • 4
    Superset: any string instead of just newline: http://stackoverflow.com/questions/1038824/how-do-i-remove-a-substring-from-the-end-of-a-string-in-python – Ciro Santilli OurBigBook.com Sep 26 '15 at 21:46
  • 9
    The A+ answer is, if this was due to forgetting to `open()` a file with the appropriate ['newline=...'](https://docs.python.org/3/library/functions.html#open) parameter for your platform (universal newline support), you might not need to explicitly remove it. – smci Dec 19 '17 at 04:03

27 Answers27

2255

Try the method rstrip() (see doc Python 2 and Python 3)

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

Python's rstrip() method strips all kinds of trailing whitespace by default, not just one newline as Perl does with chomp.

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

To strip only newlines:

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

In addition to rstrip(), there are also the methods strip() and lstrip(). Here is an example with the three of them:

>>> 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'
Rich Bradshaw
  • 71,795
  • 44
  • 182
  • 241
  • 25
    I'm not a Python person so I don't have the answer to this, but Perl's chomp() actually removes the input record separator from the end. That's a newline on Unixy things, but may be different (e.g. Windows) and it's mutable. Is there a way to remove that value only once from the end of a string? – brian d foy Nov 08 '08 at 21:04
  • 5
    brian d foy: Python doesn't have an input record separator like awk and Perl have. – Peter Hosey Nov 09 '08 at 06:13
  • 4
    Is \n sufficient? >>> "test string\r\n".rstrip("\n") 'test string\r' – Andrew Grimm Jul 03 '09 at 01:43
  • \r itself won't trigger a newline anywhere (except for OSX, but who cares about OSX?) – dom0 May 15 '12 at 16:12
  • 8
    @csde_rats, that's not true: OS X uses `\n` for newlines just like Unix. (Prior to OS X, MacOS did use `\r` as a line separator, but that ended 10 years ago.) – skue Nov 04 '12 at 19:03
  • 23
    @briandfoy Python has built-in support for Universal newlines (only when reading, not when writing). You open the file in either "U" or "rU" mode, and then regardless of Windows, Linux, Mac, whatever, by the time the text reaches your python code, any style of newline has been replaced with "\n". See: http://www.python.org/dev/peps/pep-0278/ – AlcubierreDrive Nov 07 '12 at 08:11
  • This only removes the first \n not all the \n's. What if I have a string as: "sadsa\nsadas\nsadsad\n" **How can I remove ALL the newlines?** replace('\n', '') doesn't work either. – Alex Bitek Feb 05 '13 at 20:58
  • 1
    Just in case someone misunderstand the example: the argument for `strip`, `rstrip`, `lstrip` is used as a list of characters, not a string. So `'abcdedcba'.strip("abc")` gives `def`, not `cdedcba`! – yegle Feb 28 '13 at 15:39
  • @skue: What about Windows? If you remove the `\n` you still get `\r`. – Alix Axel May 13 '13 at 16:55
  • 2
    @yegle, I think you mean 'ded', not 'def'. :) – fbicknel Oct 02 '14 at 17:40
  • 3
    @AlixAxel As stated above by @AlcubierreDrive, handling newlines in a portable way means they are converted to the canonical `\n` form when they are read from the file. Then, your program working with strings will never see the `\r` characters. – Colin D Bennett Feb 03 '15 at 18:16
  • I know this isn't really a question but is brought up in the comments. Is there any reason why `text.rstrip(os.linesep)` would not work in an OS-independent way to achieve this? – sethmlarson Mar 07 '16 at 20:37
  • 24
    I'm going to go ahead and spell this out because I'm a noob and I spent a while wondering why it wasn't working. `.strip()` does not alter the string (probably has something to do with immutable strings). If not in command line, you'll want `"string = string.strip()"` – Script Kitty Apr 12 '16 at 01:06
  • 4
    rstrip() on its own is going to give you a lot of headaches if you're processing TSVs with some empty columns. For example "foo\tbar\t\t\n".rstrip() will remove the last two empty columns from your data. – Robert Sim Sep 28 '17 at 17:40
  • Necessary to get clean string variables passed via argsparse. Windows newlines made them not even show up at all in string concatenation. – Alex Hall Dec 03 '19 at 11:49
  • wondering why this isn't the accepted answer? – iomv Jul 27 '23 at 11:34
183

And I would say the "pythonic" way to get lines without trailing newline characters is splitlines().

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
Ryan Ginstrom
  • 13,915
  • 5
  • 45
  • 60
  • 8
    note: [`str.splitlines()` treats as newlines many characters (not just `\r`, `\n`)](https://docs.python.org/3/library/stdtypes.html#str.splitlines) – jfs Jan 25 '16 at 06:57
  • This also gives unexpected results if you have a multi-line string and only want to strip the last line-terminator.... (although it can probably by joined back again for that) – Gert van den Berg Dec 31 '21 at 19:27
  • @GertvandenBerg the method is called `splitlines()`. If I give it a multi-_line_ string, I don't expect it to strip only the last line, because I literaly told it to split my multi-line string into multiple strings at the line breaks ;) Using it to strip line endings off a single-line string is actually just a useful corner case. – SvenS May 05 '22 at 10:51
167

The canonical way to strip end-of-line (EOL) characters is to use the string rstrip() method removing any trailing \r or \n. Here are examples for Mac, Windows, and Unix EOL characters.

>>> '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'

Using '\r\n' as the parameter to rstrip means that it will strip out any trailing combination of '\r' or '\n'. That's why it works in all three cases above.

This nuance matters in rare cases. For example, I once had to process a text file which contained an HL7 message. The HL7 standard requires a trailing '\r' as its EOL character. The Windows machine on which I was using this message had appended its own '\r\n' EOL character. Therefore, the end of each line looked like '\r\r\n'. Using rstrip('\r\n') would have taken off the entire '\r\r\n' which is not what I wanted. In that case, I simply sliced off the last two characters instead.

Note that unlike Perl's chomp function, this will strip all specified characters at the end of the string, not just one:

>>> "Hello\n\n\n".rstrip("\n")
"Hello"
Flimm
  • 136,138
  • 45
  • 251
  • 267
Mike
  • 3,663
  • 3
  • 20
  • 12
  • 7
    Note that modern Mac OS X apps use \n. Only old Carbon apps originally written for Mac OS use \r. – Peter Hosey Nov 09 '08 at 06:15
  • 2
    Thanks for the clarification. Of course, the rstrip('\r\n') still works in that case too. – Mike Nov 09 '08 at 11:35
  • 14
    There's also [`os.linesep`](http://docs.python.org/library/os.html#os.linesep), which contains the EOL sequence for the current OS. – Eli Collins Aug 15 '11 at 13:44
  • This is the best answer: It *only* strips newlines, and does it correctly for the most common platforms. – kevinarpe Feb 12 '15 at 03:58
  • plus +1 For using `\n` and `\r` – fechnert May 28 '15 at 15:35
  • @Tim: normally, you won't see `\r` in in the input because Python uses universal newlines mode by default ([`'\n'`, `'\r'`, or `'\r\n'` are translated to `'\n'` while reading](https://docs.python.org/3/library/functions.html#open)). If you want to take into account Unicode newlines; see [`str.splitlines()`](https://docs.python.org/3/library/stdtypes.html#str.splitlines). – jfs Jan 25 '16 at 06:56
  • Upvoting because this is much safer than rstrip() with no arguments. – Robert Sim Sep 28 '17 at 17:43
  • @Tim that may be true for reading files, but I'm processing stdout of a batch script called by my python script (don't ask...) so I have plenty of `\r\n`s. Which of course is done line by line, so `splitlines()` is a bit overkill. – SvenS May 05 '22 at 10:57
102

Note that rstrip doesn't act exactly like Perl's chomp() because it doesn't modify the string. That is, in Perl:

$x="a\n";

chomp $x

results in $x being "a".

but in Python:

x="a\n"

x.rstrip()

will mean that the value of x is still "a\n". Even x=x.rstrip() doesn't always give the same result, as it strips all whitespace from the end of the string, not just one newline at most.

Flimm
  • 136,138
  • 45
  • 251
  • 267
55

I might use something like this:

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

I think the problem with rstrip("\n") is that you'll probably want to make sure the line separator is portable. (some antiquated systems are rumored to use "\r\n"). The other gotcha is that rstrip will strip out repeated whitespace. Hopefully os.linesep will contain the right characters. the above works for me.

Flimm
  • 136,138
  • 45
  • 251
  • 267
Jamie
  • 583
  • 4
  • 2
  • 13
    This won't work however if you are trying to clean up user submitted content in a web application. The user content could come from any source and contain any newline chars. – apiguy Jan 18 '12 at 18:50
  • 2
    Good point, except that you may be processing 'foreign' files (from antiquated systems) on your modern os. – ChuckCottrill Feb 06 '16 at 02:56
  • 1
    Keep in mind also that if you are reading a file in text mode, this won't work on a Windows system either, because the trailing character will always be converted to '\n'. – Mad Physicist Apr 28 '17 at 19:55
  • @MadPhysicist You are right that it does convert it, but it still works because it is the same as `rstrip('\r\n')` and `rstrip()` will strip any characters that are in the argument. – dtauxe Apr 18 '19 at 20:06
43

You may use line = line.rstrip('\n'). This will strip all newlines from the end of the string, not just one.

Flimm
  • 136,138
  • 45
  • 251
  • 267
kiriloff
  • 25,609
  • 37
  • 148
  • 229
39
s = s.rstrip()

will remove all newlines at the end of the string s. The assignment is needed because rstrip returns a new string instead of modifying the original string.

Flimm
  • 136,138
  • 45
  • 251
  • 267
slec
  • 539
  • 6
  • 7
36
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

or you could always get geekier with regexps

desertnaut
  • 57,590
  • 26
  • 140
  • 166
mihaicc
  • 3,034
  • 1
  • 24
  • 20
  • This worked great for me trying to quickly turn a text file with line endings into one line of text. I'm a newbie, so not sure if there's a better way to do it, but it worked, thanks! (Strip seemed to only work from the ends, not internally) – Steve Koch Jan 20 '13 at 16:27
  • 2
    Why not just use one replace statement, like `.replace('\n|\r', '')`? – tckmn Jul 07 '13 at 18:19
  • 2
    Just in case anyone else wants to use the idea from @DoorknobofSnow, it's just a small change to use the regex module: `import re` `re.sub('\n|\r', '', '\nx\n\r\n')` ==> `'x'`. – Taylor D. Edmiston Feb 09 '14 at 01:50
  • Using this and regex technique as @TaylorEdmiston mentioned should be the proper answer. – Bhargav Jul 25 '17 at 14:59
  • @Bhargav I've added an answer to this question based upon this comment as you suggested while also exploring a few other related options. I also clarified why I think regex is a better solution to this problem than str.rstrip since that's what most answers use. – Taylor D. Edmiston Jul 27 '17 at 05:26
35

This would replicate exactly perl's chomp (minus behavior on arrays) for "\n" line terminator:

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

(Note: it does not modify string 'in place'; it does not strip extra trailing whitespace; takes \r\n in account)

Alien Life Form
  • 1,884
  • 1
  • 19
  • 27
  • how could it modify the string at all... they're immutable objects. – Eric May 27 '22 at 11:46
  • @eric It does not modify the string. It returns a modified copy of x. Modifying strings in place is a perl thing, not a python one. – Alien Life Form May 30 '22 at 10:04
  • my point is that your **Note** is confusing: by stating the code doesn't modify strings, beginners may assume this is a thing in Python. – Eric Jun 04 '22 at 08:37
  • @eric. OK, the note is a qualification to the preceding statement "This would replicate exactly perl's chomp". An exact replica of perl's chomp is not possible in python. – Alien Life Form Jun 07 '22 at 08:04
  • Whatever man... – Eric Jun 22 '22 at 15:25
32

you can use strip:

line = line.strip()

demo:

>>> "\n\n hello world \n\n".strip()
'hello world'
Flimm
  • 136,138
  • 45
  • 251
  • 267
Hackaholic
  • 19,069
  • 5
  • 54
  • 72
20

rstrip doesn't do the same thing as chomp, on so many levels. Read http://perldoc.perl.org/functions/chomp.html and see that chomp is very complex indeed.

However, my main point is that chomp removes at most 1 line ending, whereas rstrip will remove as many as it can.

Here you can see rstrip removing all the newlines:

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

A much closer approximation of typical Perl chomp usage can be accomplished with re.sub, like this:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'
ingydotnet
  • 2,466
  • 2
  • 16
  • 10
  • 2
    Kudos, you're the only one that pointed out this very important detail. However, as someone above noted, using os.linesep won't work if you're reading files from a different system. This might take a bit more work in Python, actually inspecting the end of the line. – brianmearns Aug 15 '12 at 01:22
19

An example in Python's documentation simply uses line.strip().

Perl's chomp function removes one linebreak sequence from the end of a string only if it's actually there.

Here is how I plan to do that in Python, if process is conceptually the function that I need in order to do something useful to each line from this file:

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
  • 4,726
  • 21
  • 34
19

Careful with "foo".rstrip(os.linesep): That will only chomp the newline characters for the platform where your Python is being executed. Imagine you're chimping the lines of a Windows file under Linux, for instance:

$ 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'
>>>

Use "foo".rstrip("\r\n") instead, as Mike says above.

Carlos Valiente
  • 902
  • 7
  • 9
  • 1
    The other thing to note is that it does not remove at most one newline, but all newlines, unlike `chomp`. – Flimm Jun 30 '16 at 16:16
13

I don't program in Python, but I came across an FAQ at python.org advocating S.rstrip("\r\n") for python 2.2 or later.

Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338
12
import re

r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)
  • 2
    This is also going to remove tab whitespace, which the original question does not request. ( Due to the \t character ) – NoahR Nov 10 '14 at 21:55
9

If your question is to clean up all the line breaks in a multiple line str object (oldstr), you can split it into a list according to the delimiter '\n' and then join this list into a new str(newstr).

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

Leozj
  • 99
  • 1
  • 2
9

I find it convenient to have be able to get the chomped lines via in iterator, parallel to the way you can get the un-chomped lines from a file object. You can do so with the following code:

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

Sample usage:

with open("file.txt") as infile:
    for line in chomped_lines(infile):
        process(line)
kuzzooroo
  • 6,788
  • 11
  • 46
  • 84
  • Note: With `operator.methodcaller` and `map` (`itertools.imap` on Py2) you can push this work to the C layer, avoiding Python level generator code (and thereby running a bit faster, though admittedly I/O overhead is likely to mask small gains): `for line in map(operator.methodcaller('rstrip', '\r\n'), infile):`. It could be still be factored out as `def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it)`. – ShadowRanger Aug 11 '17 at 15:34
9

I'm bubbling up my regular expression based answer from one I posted earlier in the comments of another answer. I think using re is a clearer more explicit solution to this problem than str.rstrip.

>>> import re

If you want to remove one or more trailing newline chars:

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

If you want to remove newline chars everywhere (not just trailing):

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

If you want to remove only 1-2 trailing newline chars (i.e., \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'

I have a feeling what most people really want here, is to remove just one occurrence of a trailing newline character, either \r\n or \n and nothing more.

>>> 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'

(The ?: is to create a non-capturing group.)

(By the way this is not what '...'.rstrip('\n', '').rstrip('\r', '') does which may not be clear to others stumbling upon this thread. str.rstrip strips as many of the trailing characters as possible, so a string like foo\n\n\n would result in a false positive of foo whereas you may have wanted to preserve the other newlines after stripping a single trailing one.)

Taylor D. Edmiston
  • 12,088
  • 6
  • 56
  • 76
  • You could skip the non-capturing group, even for your final approach, with the regex `r'\r?\n$'`. Likely more efficient, since regex engines have a harder time optimizing alternations. Also note that if you're going to do this many times, it will be significantly faster (especially if you're intermingling with other `re` uses) to `re.compile` the expression once up front, then use the `sub` method of the compiled regex object; module functions are Python level and check a cache for compiled regexes first (creating/caching if missing), then call the matching method; skipping that lookup helps. – ShadowRanger Aug 11 '17 at 15:26
  • 1
    Also, side-note: Since you're trying to match the `\n` directly, you might want to use `\Z` over `$` (or just match `\r?$`, since `$` implicitly can match just before the newline at the end of a string). – ShadowRanger Aug 11 '17 at 15:40
8

It looks like there is not a perfect analog for perl's chomp. In particular, rstrip cannot handle multi-character newline delimiters like \r\n. However, splitlines does as pointed out here. Following my answer on a different question, you can combine join and splitlines to remove/replace all newlines from a string s:

''.join(s.splitlines())

The following removes exactly one trailing newline (as chomp would, I believe). Passing True as the keepends argument to splitlines retain the delimiters. Then, splitlines is called again to remove the delimiters on just the last "line":

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''
Community
  • 1
  • 1
teichert
  • 3,963
  • 1
  • 31
  • 37
8

workaround solution for special case:

if the newline character is the last character (as is the case with most file inputs), then for any element in the collection you can index as follows:

foobar= foobar[:-1]

to slice out your newline character.

Chij
  • 89
  • 1
  • 1
  • 3
    Sometimes the newline is not _a_ last character, but the last ones, specially on windows, as others have pointed out. – Cacovsky Jun 01 '12 at 19:14
7
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'

With regex

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

Replace \n,\t,\r

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

With regex

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

with Join

s = '''Hello  World \t\n\r\tHi There'''
' '.join(s.split())
>'Hello  World Hi There'
5
>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'
  • The example I needed! So rstrip("\r\n") will strip both '\n' and '\r' in any combination at the end of the line! – Agostino Nov 22 '16 at 21:11
  • @Agostino No need to provide `"\r\n"` For example: `' spacious \n\r\n\r \n\n'.rstrip()` produces `' spacious'` – oHo May 11 '17 at 19:31
  • 2
    @olibre the code you suggest will also strip other blank/space characters, which might not be what one needs. In fact, I only needed to strip combinations of eol characters. Still, thanks for pointing this out. – Agostino May 15 '17 at 19:15
4

Just use :

line = line.rstrip("\n")

or

line = line.strip("\n")

You don't need any of this complicated stuff

Tyler A.
  • 3,048
  • 1
  • 23
  • 27
Help me
  • 51
  • 1
3

There are three types of line endings that we normally encounter: \n, \r and \r\n. A rather simple regular expression in re.sub, namely r"\r?\n?$", is able to catch them all.

(And we gotta catch 'em all, am I right?)

import re

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

With the last argument, we limit the number of occurences replaced to one, mimicking chomp to some extent. Example:

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)

... where a == b == c is True.

internetional
  • 312
  • 2
  • 8
  • You don't even need full fledged regular expressions. `rstrip("\r\n")` is a catch-all. Try `print(text_2.rstrip('\r\n'))`. – Agostino Nov 22 '16 at 21:20
  • @Agostino : True, given that `str.rstrip()` solves the problem. It depends on which needs you have. This solution is specifically made for the cases when you need to remove just the last `"\n"`, `"\r"` or `"\r\n"` but not all of them (if there are multiple `"\n"` in the string). `re.sub(r"\r?\n?$", "", text_1, 1)` returns `"hellothere\n\n"` and `text_1.rstrip("\r\n")` returns `"hellothere"` which is a different string. – internetional Nov 22 '16 at 21:39
  • What I am trying to say is: that `str.strip()` is a catch-all is sometimes the very problem. – internetional Nov 22 '16 at 21:43
1

If you are concerned about speed (say you have a looong list of strings) and you know the nature of the newline char, string slicing is actually faster than rstrip. A little test to illustrate this:

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()

Output:

Method 1: 3.92700004578
Method 2: 6.73000001907
Stephen Miller
  • 503
  • 3
  • 11
  • I know I should probably use "global loops" inside of the functions, but this works as well. – Stephen Miller Oct 28 '15 at 14:21
  • This test is wrong and not fair.. In ``method1`` you are just chopping off the last character, no matter what, in ``method2`` the ``.rstrip()`` first checks, if the end of the String contains undesired characters and chops them off, only if some were found. Please implement some check for characters in ``method1`` and test agin! – spky May 24 '16 at 21:17
  • As I said in the intro to the answer: If you know the nature of the newline char, then this is useful. If you don't then yes, you obviously need to implement some sort of character check - or just use rstrip. I did not mean to be "unfair" to rstrip, but simply illustrate a not so insignificant difference that may be worth considering in some situations. – Stephen Miller May 29 '16 at 13:30
0

This will work both for windows and linux (bit expensive with re sub if you are looking for only re solution)

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

Venfah Nazir
  • 320
  • 2
  • 6
-2

A catch all:

line = line.rstrip('\r|\n')
demongolem
  • 9,474
  • 36
  • 90
  • 105
  • 6
    `rstrip` does not take regular expression. `"hi|||\n\n".rstrip("\r|\n")` returns `"hi"` – Flimm Jun 30 '16 at 16:20