Estoy aumentando mi respuesta basada en expresiones regulares de una que publiqué anteriormente en los comentarios de otra respuesta. Creo que usar rees una solución más clara y explícita para este problema que str.rstrip.
>>> import re
Si desea eliminar uno o más caracteres de nueva línea finales :
>>> re.sub(r'[\n\r]+$', '', '\nx\r\n')
'\nx'
Si desea eliminar caracteres de nueva línea en todas partes (no solo al final):
>>> re.sub(r'[\n\r]+', '', '\nx\r\n')
'x'
Si desea eliminar sólo 1-2 caracteres salto de línea final (es decir, \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'
Tengo la sensación de que lo que la mayoría de la gente realmente quiere aquí es eliminar solo una ocurrencia de un personaje de nueva línea final, ya sea \r\no \nnada más.
>>> 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'
(Los ?: objetivo es crear un grupo sin captura).
(Por cierto, esto no es lo '...'.rstrip('\n', '').rstrip('\r', '')que no está claro para otros que se topan con este hilo. str.rstripQuita la mayor cantidad posible de caracteres finales, por lo que una cadena como foo\n\n\nresultaría en un falso positivo foomientras que es posible que haya querido preservar el otras líneas nuevas después de quitar una sola final).