Pertanyaan Bagaimana saya bisa menghapus (chomp) baris baru di belakang dengan Python?


Apa yang setara dengan Python dari Perl chomp fungsi, yang menghilangkan karakter terakhir dari string jika itu adalah newline?


1328
2017-11-08 18:25


asal


Jawaban:


Coba metode ini rstrip() (lihat dokumen Python 2 dan Python 3)

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

Python rstrip() strip metode semua jenis spasi kosong secara default, bukan hanya satu baris baru seperti Perl chomp.

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

Untuk menghapus hanya baris baru:

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

Ada juga metodenya lstrip() dan 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'

1388
2017-11-09 05:52



Dan saya akan mengatakan cara "pythonic" untuk mendapatkan garis tanpa mengikuti karakter baris baru adalah 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



Cara kanonik untuk menghapus karakter end-of-line (EOL) adalah dengan menggunakan metode string rstrip () untuk menghapus trailing \ r atau \ n. Berikut ini contoh untuk karakter Mac, Windows, dan 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'

Menggunakan '\ r \ n' sebagai parameter ke rstrip berarti akan menghapus kombinasi trailing '\ r' atau '\ n'. Itu sebabnya ia bekerja di ketiga kasus di atas.

Nuansa ini penting dalam kasus yang jarang terjadi. Sebagai contoh, saya pernah memproses file teks yang berisi pesan HL7. Standar HL7 membutuhkan trailing '\ r' sebagai karakter EOL-nya. Mesin Windows tempat saya menggunakan pesan ini telah menambahkan karakter EOL-nya sendiri. Oleh karena itu, akhir setiap baris tampak seperti '\ r \ r \ n'. Menggunakan rstrip ('\ r \ n') akan menghapus seluruh '\ r \ r \ n' yang bukan yang saya inginkan. Dalam hal ini, saya hanya memotong dua karakter terakhir sebagai gantinya.

Perhatikan bahwa tidak seperti Perl chomp fungsi, ini akan menghapus semua karakter yang ditentukan di akhir string, bukan hanya satu:

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

125
2017-11-28 17:31



Perhatikan bahwa rstrip tidak bertindak persis seperti chomp Perl () karena tidak memodifikasi string. Artinya, dalam Perl:

$x="a\n";

chomp $x

hasil dalam $x makhluk "a".

tetapi dengan Python:

x="a\n"

x.rstrip()

akan berarti bahwa nilai x aku s masih  "a\n". Bahkan x=x.rstrip() tidak selalu memberikan hasil yang sama, karena menghapus semua spasi dari ujung string, tidak hanya satu baris baru paling banyak.


96
2018-03-07 16:07



Saya mungkin menggunakan sesuatu seperti ini:

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

Saya pikir masalah dengan rstrip("\n") adalah Anda mungkin ingin memastikan pemisah baris portabel. (beberapa sistem kuno dikabarkan digunakan "\r\n"). Gotcha lainnya adalah itu rstrip akan menghapus ruang putih yang berulang. Semoga os.linesep akan berisi karakter yang tepat. di atas bekerja untuk saya.


46
2018-05-13 16:41



Anda dapat menggunakan line = line.rstrip('\n'). Ini akan menghapus semua baris baru dari ujung string, bukan hanya satu.


37
2018-03-09 08:02



s = s.rstrip()

akan menghapus semua baris baru di akhir string s. Tugas itu diperlukan karena rstrip mengembalikan string baru alih-alih memodifikasi string asli.


28
2018-02-29 22:40