Bagaimana saya bisa menghapus baris tambahan?

1689

Apakah persamaan Python dari chompfungsi Perl , yang menghilangkan karakter terakhir dari string jika itu adalah baris baru?

Georgy
sumber
2
Superset: string apa pun, bukan hanya baris baru: stackoverflow.com/questions/1038824/…
Ciro Santilli 郝海东 冠状 病 六四 六四 法轮功
3
Jawaban A + adalah, jika ini karena lupa ke open()file dengan parameter 'newline = ...' yang sesuai untuk platform Anda (universal newline support), Anda mungkin tidak perlu menghapusnya secara eksplisit.
smci

Jawaban:

1868

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

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

rstrip()Metode Python melucuti semua jenis spasi spasi secara default, tidak 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 metode 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'
Markus Jarderot
sumber
22
Saya bukan orang Python jadi saya tidak punya jawaban untuk ini, tetapi Perl chomp () benar-benar menghapus pemisah catatan input dari akhir. Itu baris baru pada hal-hal Unixy, tetapi mungkin berbeda (misalnya Windows) dan itu bisa berubah. Apakah ada cara untuk menghapus nilai itu hanya sekali dari ujung string?
brian d foy
5
brian d foy: Python tidak memiliki pemisah catatan input seperti awk dan Perl miliki.
Peter Hosey
7
@csde_rats, itu tidak benar: OS X digunakan \nuntuk baris baru seperti Unix. (Sebelum OS X, MacOS memang digunakan \rsebagai pemisah garis, tetapi itu berakhir 10 tahun yang lalu.)
skue
21
@briandfoy Python memiliki dukungan bawaan untuk baris baru Universal (hanya saat membaca, bukan saat menulis). Anda membuka file dalam mode "U" atau "rU", dan terlepas dari Windows, Linux, Mac, apa pun, pada saat teks mencapai kode python Anda, gaya baris baru telah diganti dengan "\ n". Lihat: python.org/dev/peps/pep-0278
AlcubierreDrive
12
Saya akan melanjutkan dan menguraikan ini karena saya seorang noob dan saya menghabiskan waktu sambil bertanya-tanya mengapa itu tidak berhasil. .strip()tidak mengubah string (mungkin ada hubungannya dengan string tidak berubah). Jika tidak di baris perintah, Anda akan ingin"string = string.strip()"
Script Kitty
146

Cara kanonik untuk menghapus karakter end-of-line (EOL) adalah dengan menggunakan metode string rstrip () menghapus semua trailing \ r atau \ n. Berikut adalah 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 untuk rstrip berarti bahwa ia akan menghapus semua kombinasi trailing dari '\ r' atau '\ n'. Itu sebabnya ia bekerja dalam ketiga kasus di atas.

Nuansa ini penting dalam kasus yang jarang terjadi. Sebagai contoh, saya pernah harus 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 '\ r \ n' miliknya sendiri. Oleh karena itu, akhir setiap baris tampak seperti '\ r \ r \ n'. Menggunakan rstrip ('\ r \ n') akan menghapus keseluruhan '\ r \ r \ n' yang bukan yang saya inginkan. Dalam hal itu, saya hanya memotong dua karakter terakhir sebagai gantinya.

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

>>> "Hello\n\n\n".rstrip("\n")
"Hello"
Mike
sumber
7
Perhatikan bahwa aplikasi Mac OS X modern menggunakan \ n. Hanya aplikasi Carbon lama yang awalnya ditulis untuk Mac OS yang menggunakan \ r.
Peter Hosey
2
Terimakasih atas klarifikasinya. Tentu saja, rstrip ('\ r \ n') masih berfungsi dalam kasus itu juga.
Mike
13
Ada juga os.linesep, yang berisi urutan EOL untuk OS saat ini.
Eli Collins
Ini adalah jawaban terbaik: Itu hanya menghapus baris baru, dan melakukannya dengan benar untuk platform yang paling umum.
kevinarpe
plus +1 Untuk menggunakan \ndan\r
fechnert
99

Perhatikan bahwa rstrip tidak bekerja persis seperti chomp () Perl karena tidak mengubah string. Yaitu, di Perl:

$x="a\n";

chomp $x

hasil $xmenjadi "a".

tetapi dengan Python:

x="a\n"

x.rstrip()

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

Flimm
sumber
7
Juga, strip () menghapus karakter yang diulang, sedangkan chop / chomp hanya menghapus satu baris baru
kostmo
50

Saya mungkin menggunakan sesuatu seperti ini:

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

Saya pikir masalahnya rstrip("\n")adalah Anda mungkin ingin memastikan garis pemisahnya portabel. (beberapa sistem kuno dikabarkan akan digunakan "\r\n"). Gotcha lainnya adalah yang rstripakan menghapus spasi putih berulang. Semoga os.linesepakan berisi karakter yang tepat. hal di atas berfungsi untuk saya.

Jamie
sumber
12
Namun ini tidak akan berhasil jika Anda mencoba untuk membersihkan konten yang dikirimkan pengguna dalam aplikasi web. Konten pengguna dapat berasal dari sumber apa pun dan mengandung karakter baris baru.
apiguy
2
Poin yang bagus, kecuali bahwa Anda mungkin memproses file 'asing' (dari sistem kuno) pada os modern Anda.
ChuckCottrill
1
Ingat juga bahwa jika Anda membaca file dalam mode teks, ini juga tidak akan bekerja pada sistem Windows, karena karakter trailing akan selalu dikonversi ke '\ n'.
Fisikawan Gila
@MadPhysicist Anda benar bahwa ia mengonversinya, tetapi masih berfungsi karena sama rstrip('\r\n')dan rstrip()akan menghapus karakter apa pun yang ada dalam argumen.
dtauxe
41

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

Kiriloff
sumber
35
s = s.rstrip()

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

potongan
sumber
33

Ini akan meniru persis chomp perl (perilaku minus pada array) untuk terminator garis "\ n":

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

(Catatan: itu tidak mengubah string 'di tempat'; itu tidak menghapus spasi tambahan trailing; mengambil \ r \ n di akun)

Bentuk Kehidupan Alien
sumber
27
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

atau Anda selalu bisa mendapatkan geekier dengan regexps :)

Selamat bersenang-senang!

mungkin
sumber
Ini bekerja dengan baik untuk saya mencoba dengan cepat mengubah file teks dengan ujung baris menjadi satu baris teks. Saya seorang pemula, jadi tidak yakin apakah ada cara yang lebih baik untuk melakukannya, tetapi berhasil, terima kasih! (Strip sepertinya hanya bekerja dari ujung, bukan secara internal)
Steve Koch
2
Mengapa tidak menggunakan satu pernyataan ganti saja .replace('\n|\r', '')?
tckmn
2
Kalau-kalau ada orang lain yang ingin menggunakan ide dari @DoorknobofSnow, itu hanya perubahan kecil untuk menggunakan modul regex: import re re.sub('\n|\r', '', '\nx\n\r\n')==> 'x'.
Taylor Edmiston
Menggunakan teknik ini dan regex seperti yang disebutkan @TaylorEdmiston harus menjadi jawaban yang tepat.
Bhargav
@Bhargav Saya telah menambahkan jawaban untuk pertanyaan ini berdasarkan komentar ini seperti yang Anda sarankan sambil juga mengeksplorasi beberapa opsi terkait lainnya. Saya juga menjelaskan mengapa saya pikir regex adalah solusi yang lebih baik untuk masalah ini daripada str.rstrip karena itulah yang digunakan sebagian besar jawaban.
Taylor Edmiston
27

Anda dapat menggunakan strip:

line = line.strip()

demo:

>>> "\n\n hello world \n\n".strip()
'hello world'
Hackaholic
sumber
1
Sudah mencoba solusi ini tetapi menghilangkan kekurangan di garis depan.
Tarik
@Tarik Anda dapat menggunakan rstrip
Hackaholic
rstrip akan menghapus semua spasi spasi tambahan, tidak seperti chomp yang hanya menghapus paling banyak satu baris baru.
Flimm
20

rstrip tidak melakukan hal yang sama seperti chomp, pada banyak level. Baca http://perldoc.perl.org/functions/chomp.html dan lihat bahwa chomp memang sangat kompleks.

Namun, poin utama saya adalah bahwa chomp menghapus paling banyak 1 akhir baris, sedangkan rstrip akan menghapus sebanyak mungkin.

Di sini Anda dapat melihat rstrip menghapus semua baris baru:

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

Perkiraan yang jauh lebih dekat dari penggunaan Perl chomp khas dapat dilakukan dengan re.sub, seperti ini:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'
ingydotnet
sumber
2
Kudos, kaulah satu-satunya yang menunjukkan detail yang sangat penting ini. Namun, seperti yang dicatat seseorang di atas, menggunakan os.linesep tidak akan berfungsi jika Anda membaca file dari sistem yang berbeda. Ini mungkin membutuhkan sedikit lebih banyak pekerjaan di Python, sebenarnya memeriksa akhir baris.
brianmearns
19

Hati-hati dengan "foo".rstrip(os.linesep): Itu hanya akan mengejar karakter baris baru untuk platform tempat Python Anda dieksekusi. Bayangkan Anda menyimpan garis-garis file Windows di Linux, misalnya:

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

Gunakan "foo".rstrip("\r\n")sebagai gantinya, seperti kata Mike di atas.

Carlos Valiente
sumber
Hal lain yang perlu diperhatikan adalah tidak menghapus paling banyak satu baris baru, tetapi semua baris baru, tidak seperti chomp.
Flimm
19

Sebuah contoh dalam dokumentasi Python hanya menggunakan line.strip().

chompFungsi Perl menghapus satu urutan linebreak dari ujung string hanya jika itu benar-benar ada.

Berikut adalah bagaimana saya berencana untuk melakukannya dengan Python, jika processsecara konseptual fungsi yang saya butuhkan untuk melakukan sesuatu yang berguna untuk setiap baris dari file ini:

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
sumber
2
Akhirnya, jawaban yang hanya menghapusnya sekali (seperti chomp yang sebenarnya ...) dan OS portable!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
13

Saya tidak memprogram dalam Python, tapi saya menemukan FAQ di python.org yang mengadvokasi S.rstrip ("\ r \ n") untuk python 2.2 atau lebih baru.

Andrew Grimm
sumber
10
import re

r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)

sumber
2
Ini juga akan menghapus spasi spasi tab, yang tidak diminta pertanyaan aslinya. (Karena karakternya)
NoahR
9

Saya merasa nyaman untuk bisa mendapatkan baris chomped melalui di iterator, sejajar dengan cara Anda bisa mendapatkan baris un-chomped dari objek file. Anda dapat melakukannya dengan kode berikut:

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

Penggunaan sampel:

with open("file.txt") as infile:
    for line in chomped_lines(infile):
        process(line)
kuzzooroo
sumber
Catatan: Dengan operator.methodcallerdan map( itertools.imappada Py2) Anda dapat mendorong pekerjaan ini ke lapisan C, menghindari Python kode tingkat Generator (dan dengan demikian menjalankan sedikit lebih cepat, meskipun diakui I / O overhead kemungkinan untuk menutupi keuntungan kecil): for line in map(operator.methodcaller('rstrip', '\r\n'), infile):. Itu masih bisa difaktorkan sebagai def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it).
ShadowRanger
8

solusi penyelesaian untuk kasus khusus:

jika karakter baris baru adalah karakter terakhir (seperti halnya dengan sebagian besar input file), maka untuk setiap elemen dalam koleksi Anda dapat mengindeks sebagai berikut:

foobar= foobar[:-1]

untuk memotong karakter baris baru Anda.

Chij
sumber
3
Kadang-kadang baris baru tidak sebuah karakter terakhir, tetapi yang terakhir, khusus pada windows, seperti orang lain telah keluar runcing.
Cacovsky
8

Jika pertanyaan Anda adalah untuk membersihkan semua jeda baris dalam objek multi baris str (oldstr), Anda dapat membaginya menjadi daftar sesuai dengan pembatas '\ n' dan kemudian bergabung dengan daftar ini menjadi str baru (newstr).

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

Leozj
sumber
7

Sepertinya tidak ada analog yang sempurna untuk chomp perl . Secara khusus, rstrip tidak dapat menangani pembatas baris baru multi-karakter seperti \r\n. Namun, splitlines tidak seperti yang ditunjukkan di sini . Mengikuti jawaban saya pada pertanyaan yang berbeda, Anda dapat menggabungkan gabung dan splitline untuk menghapus / mengganti semua baris baru dari string s:

''.join(s.splitlines())

Berikut ini menghapus persis satu trailing newline (seperti yang dilakukan chomp, saya percaya). Melewati Truesebagai keependsargumen untuk splitlines mempertahankan pembatas. Kemudian, splitlines dipanggil lagi untuk menghapus pembatas pada "baris" terakhir:

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''
pengguna3780389
sumber
7

Saya menggelegak jawaban berdasarkan ekspresi reguler saya dari yang saya posting sebelumnya di komentar dari jawaban lain. Saya pikir menggunakan readalah solusi yang lebih jelas untuk masalah ini daripada str.rstrip.

>>> import re

Jika Anda ingin menghapus satu atau lebih membuntuti karakter baris baru:

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

Jika Anda ingin menghapus karakter baris baru di mana saja (tidak hanya mengekor):

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

Jika Anda ingin menghapus hanya 1-2 membuntuti karakter baris baru (yaitu, \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'

Saya memiliki perasaan apa yang sebenarnya diinginkan kebanyakan orang di sini, adalah untuk menghapus hanya satu kejadian karakter baris baru, baik \r\natau \ntidak lebih.

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

(Itu ?: Adalah untuk membuat grup yang tidak menangkap.)

(Ngomong-ngomong ini bukan apa '...'.rstrip('\n', '').rstrip('\r', '')yang mungkin tidak jelas bagi orang lain yang tersandung pada utas ini. str.rstripStrip sebanyak mungkin karakter trailing, jadi string seperti foo\n\n\nakan menghasilkan false positive foosedangkan Anda mungkin ingin melestarikan baris baru lainnya setelah menelanjangi satu baris tambahan.)

Taylor Edmiston
sumber
Anda bisa melewati grup yang tidak menangkap, bahkan untuk pendekatan akhir Anda, dengan regex r'\r?\n$'. Mungkin lebih efisien, karena mesin regex lebih sulit mengoptimalkan pergantian. Perhatikan juga bahwa jika Anda akan melakukan ini berkali-kali, itu akan secara signifikan lebih cepat (terutama jika Anda berbaur dengan rekegunaan lain ) ke re.compileekspresi sekali di depan, kemudian gunakan submetode objek regex yang dikompilasi; fungsi modul adalah tingkat Python dan periksa cache untuk regex yang dikompilasi terlebih dahulu (membuat / cache jika tidak ada), kemudian memanggil metode pencocokan; melewatkan pencarian itu membantu.
ShadowRanger
1
Juga, catatan tambahan: Karena Anda mencoba untuk mencocokkan \nsecara langsung, Anda mungkin ingin menggunakan \Zlebih dari $(atau hanya mencocokkan \r?$, karena $secara implisit dapat cocok sebelum baris baru di akhir string).
ShadowRanger
5
>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'

sumber
Contoh yang saya butuhkan! Jadi rstrip ("\ r \ n") akan menghapus '\ n' dan '\ r' dalam kombinasi apa pun di akhir baris!
Agostino
@ Agostino Tidak perlu menyediakan "\r\n"Misalnya: ' spacious \n\r\n\r \n\n'.rstrip()menghasilkan' spacious'
olibre
2
@olibre kode yang Anda sarankan juga akan menghapus karakter kosong / spasi lainnya, yang mungkin bukan yang dibutuhkan seseorang. Bahkan, saya hanya perlu menghapus kombinasi karakter eol. Namun, terima kasih telah menunjukkan ini.
Agostino
4

Cukup gunakan:

line = line.rstrip("\n")

atau

line = line.strip("\n")

Anda tidak perlu hal rumit ini

Tolong aku
sumber
2
Perhatikan bahwa ini tidak sama dengan chomp.
Flimm
4
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'

Dengan regex

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

Ganti \ n, \ t, \ r

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

Dengan regex

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

dengan Bergabung

s = '''Hello  World \t\n\r\tHi There'''
' '.join(s.split())
>'Hello  World Hi There'
sim
sumber
3

Ada tiga jenis akhir baris yang biasanya kita temui: \n, \rdan \r\n. Ekspresi reguler yang agak sederhana re.sub, yaitur"\r?\n?$" , mampu menangkap semuanya.

(Dan kita harus menangkap mereka semua , benarkan?)

import re

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

Dengan argumen terakhir, kami membatasi jumlah kejadian yang diganti menjadi satu, meniru chomp sampai batas tertentu. Contoh:

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)

... di mana a == b == cadalah True.

internetional
sumber
Anda bahkan tidak perlu ekspresi reguler penuh. rstrip("\r\n")adalah menangkap semua. Coba print(text_2.rstrip('\r\n')).
Agostino
@ Agostino: Benar, mengingat itu str.rstrip()menyelesaikan masalah. Itu tergantung pada kebutuhan yang Anda miliki. Solusi ini secara khusus dibuat untuk kasing saat Anda harus menghapus yang terakhir "\n", "\r"atau "\r\n"tetapi tidak semuanya (jika ada banyak "\n"string). re.sub(r"\r?\n?$", "", text_1, 1)Mengembalikan "hellothere\n\n"dan text_1.rstrip("\r\n")mengembalikan "hellothere"yang merupakan string yang berbeda.
internetional
Apa yang ingin saya katakan adalah: itu str.strip()adalah tangkapan. Semua terkadang merupakan masalah utama.
internetional
1

Jika Anda khawatir tentang kecepatan (katakanlah Anda memiliki daftar panjang string) dan Anda tahu sifat baris baru char, mengiris string sebenarnya lebih cepat daripada rstrip. Sebuah tes kecil untuk menggambarkan ini:

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

Keluaran:

Method 1: 3.92700004578
Method 2: 6.73000001907
Stephen Miller
sumber
Saya tahu saya mungkin harus menggunakan "loop global" di dalam fungsi, tetapi ini berfungsi juga.
Stephen Miller
Tes ini adalah salah dan tidak adil .. Dalam method1Anda hanya memenggal karakter terakhir, tidak peduli apa, di method2dalam .rstrip()pemeriksaan pertama, jika akhir String berisi karakter yang tidak diinginkan dan chops mereka pergi, hanya jika ada yang ditemukan. Harap laksanakan beberapa pemeriksaan karakter dimethod1 dan uji coba!
spky
Seperti yang saya katakan di intro untuk jawabannya: Jika Anda tahu sifat baris baru char, maka ini berguna. Jika Anda tidak ya, Anda jelas perlu menerapkan semacam pemeriksaan karakter - atau cukup gunakan rstrip. Saya tidak bermaksud "tidak adil" untuk rstrip, tetapi hanya menggambarkan perbedaan yang tidak begitu signifikan yang mungkin layak dipertimbangkan dalam beberapa situasi.
Stephen Miller
1

Ini akan bekerja baik untuk windows dan linux (agak mahal dengan sub kembali jika Anda hanya mencari solusi ulang)

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

Venfah Nazir
sumber
3
Mengapa menggunakan re.searchtempat yang Anda butuhkan re.sub?
wjandrea
0

Baris perpecahan pertama kemudian bergabung dengan mereka dengan pemisah yang Anda suka:

x = ' '.join(x.splitlines())

harus bekerja seperti pesona.

Biru tua
sumber
-1

Tangkapan semua:

line = line.rstrip('\r|\n')
pengguna4178860
sumber
5
rstriptidak mengambil ekspresi reguler. "hi|||\n\n".rstrip("\r|\n")kembali"hi"
Flimm