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.
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
158
Dan saya akan mengatakan cara "pythonic" untuk mendapatkan garis tanpa membuntuti karakter baris baru adalah splitlines ().
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.
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:
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.
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.
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.
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 rere.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.
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
Python2.7.1(r271:86832,Mar182011,09:09:48)[GCC 4.5.020100604[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.
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)
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:
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:
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).
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:
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)
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.
(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.)
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'
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.
s ='''Hello World \t\n\r\tHi There'''# import the module string import string
# use the method translate to convert
s.translate({ord(c):Nonefor 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'
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)
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 =50000000def 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()
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)
open()
file dengan parameter 'newline = ...' yang sesuai untuk platform Anda (universal newline support), Anda mungkin tidak perlu menghapusnya secara eksplisit.Jawaban:
Coba metode ini
rstrip()
(lihat doc Python 2 dan Python 3 )rstrip()
Metode Python melucuti semua jenis spasi spasi secara default, tidak hanya satu baris baru seperti Perlchomp
.Untuk menghapus hanya baris baru:
Ada juga metode
lstrip()
danstrip()
:sumber
\n
untuk baris baru seperti Unix. (Sebelum OS X, MacOS memang digunakan\r
sebagai pemisah garis, tetapi itu berakhir 10 tahun yang lalu.).strip()
tidak mengubah string (mungkin ada hubungannya dengan string tidak berubah). Jika tidak di baris perintah, Anda akan ingin"string = string.strip()"
Dan saya akan mengatakan cara "pythonic" untuk mendapatkan garis tanpa membuntuti karakter baris baru adalah splitlines ().
sumber
str.splitlines()
memperlakukan sebagai baris baru banyak karakter (bukan hanya\r
,\n
)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.
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
chomp
fungsi Perl , ini akan menghapus semua karakter yang ditentukan di akhir string, bukan hanya satu:sumber
os.linesep
, yang berisi urutan EOL untuk OS saat ini.\n
dan\r
Perhatikan bahwa rstrip tidak bekerja persis seperti chomp () Perl karena tidak mengubah string. Yaitu, di Perl:
hasil
$x
menjadi"a"
.tetapi dengan Python:
akan berarti bahwa nilai
x
adalah masih"a\n"
. Bahkanx=x.rstrip()
tidak selalu memberikan hasil yang sama, karena menghapus semua spasi putih dari akhir string, bukan hanya satu baris paling baru.sumber
Saya mungkin menggunakan sesuatu seperti ini:
Saya pikir masalahnya
rstrip("\n")
adalah Anda mungkin ingin memastikan garis pemisahnya portabel. (beberapa sistem kuno dikabarkan akan digunakan"\r\n"
). Gotcha lainnya adalah yangrstrip
akan menghapus spasi putih berulang. Semogaos.linesep
akan berisi karakter yang tepat. hal di atas berfungsi untuk saya.sumber
rstrip('\r\n')
danrstrip()
akan menghapus karakter apa pun yang ada dalam argumen.Anda bisa menggunakan
line = line.rstrip('\n')
. Ini akan menghapus semua baris baru dari akhir string, bukan hanya satu.sumber
akan menghapus semua baris baru di akhir string
s
. Tugas diperlukan karenarstrip
mengembalikan string baru alih-alih memodifikasi string asli.sumber
Ini akan meniru persis chomp perl (perilaku minus pada array) untuk terminator garis "\ n":
(Catatan: itu tidak mengubah string 'di tempat'; itu tidak menghapus spasi tambahan trailing; mengambil \ r \ n di akun)
sumber
atau Anda selalu bisa mendapatkan geekier dengan regexps :)
Selamat bersenang-senang!
sumber
.replace('\n|\r', '')
?import re
re.sub('\n|\r', '', '\nx\n\r\n')
==>'x'
.Anda dapat menggunakan strip:
demo:
sumber
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:
Perkiraan yang jauh lebih dekat dari penggunaan Perl chomp khas dapat dilakukan dengan re.sub, seperti ini:
sumber
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:Gunakan
"foo".rstrip("\r\n")
sebagai gantinya, seperti kata Mike di atas.sumber
chomp
.Sebuah contoh dalam dokumentasi Python hanya menggunakan
line.strip()
.chomp
Fungsi Perl menghapus satu urutan linebreak dari ujung string hanya jika itu benar-benar ada.Berikut adalah bagaimana saya berencana untuk melakukannya dengan Python, jika
process
secara konseptual fungsi yang saya butuhkan untuk melakukan sesuatu yang berguna untuk setiap baris dari file ini:sumber
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.
sumber
sumber
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:
Penggunaan sampel:
sumber
operator.methodcaller
danmap
(itertools.imap
pada 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 sebagaidef chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it)
.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:
untuk memotong karakter baris baru Anda.
sumber
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'))
sumber
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 strings
:Berikut ini menghapus persis satu trailing newline (seperti yang dilakukan chomp, saya percaya). Melewati
True
sebagaikeepends
argumen untuk splitlines mempertahankan pembatas. Kemudian, splitlines dipanggil lagi untuk menghapus pembatas pada "baris" terakhir:sumber
Saya menggelegak jawaban berdasarkan ekspresi reguler saya dari yang saya posting sebelumnya di komentar dari jawaban lain. Saya pikir menggunakan
re
adalah solusi yang lebih jelas untuk masalah ini daripadastr.rstrip
.Jika Anda ingin menghapus satu atau lebih membuntuti karakter baris baru:
Jika Anda ingin menghapus karakter baris baru di mana saja (tidak hanya mengekor):
Jika Anda ingin menghapus hanya 1-2 membuntuti karakter baris baru (yaitu,
\r
,\n
,\r\n
,\n\r
,\r\r
,\n\n
)Saya memiliki perasaan apa yang sebenarnya diinginkan kebanyakan orang di sini, adalah untuk menghapus hanya satu kejadian karakter baris baru, baik
\r\n
atau\n
tidak lebih.(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.rstrip
Strip sebanyak mungkin karakter trailing, jadi string sepertifoo\n\n\n
akan menghasilkan false positivefoo
sedangkan Anda mungkin ingin melestarikan baris baru lainnya setelah menelanjangi satu baris tambahan.)sumber
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 denganre
kegunaan lain ) kere.compile
ekspresi sekali di depan, kemudian gunakansub
metode 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.\n
secara langsung, Anda mungkin ingin menggunakan\Z
lebih dari$
(atau hanya mencocokkan\r?$
, karena$
secara implisit dapat cocok sebelum baris baru di akhir string).sumber
"\r\n"
Misalnya:' spacious \n\r\n\r \n\n'.rstrip()
menghasilkan' spacious'
Cukup gunakan:
atau
Anda tidak perlu hal rumit ini
sumber
Dengan regex
Ganti \ n, \ t, \ r
Dengan regex
dengan Bergabung
sumber
Ada tiga jenis akhir baris yang biasanya kita temui:
\n
,\r
dan\r\n
. Ekspresi reguler yang agak sederhanare.sub
, yaitur"\r?\n?$"
, mampu menangkap semuanya.(Dan kita harus menangkap mereka semua , benarkan?)
Dengan argumen terakhir, kami membatasi jumlah kejadian yang diganti menjadi satu, meniru chomp sampai batas tertentu. Contoh:
... di mana
a == b == c
adalahTrue
.sumber
rstrip("\r\n")
adalah menangkap semua. Cobaprint(text_2.rstrip('\r\n'))
.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"
dantext_1.rstrip("\r\n")
mengembalikan"hellothere"
yang merupakan string yang berbeda.str.strip()
adalah tangkapan. Semua terkadang merupakan masalah utama.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:
Keluaran:
sumber
method1
Anda hanya memenggal karakter terakhir, tidak peduli apa, dimethod2
dalam.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!Ini akan bekerja baik untuk windows dan linux (agak mahal dengan sub kembali jika Anda hanya mencari solusi ulang)
sumber
re.search
tempat yang Anda butuhkanre.sub
?Baris perpecahan pertama kemudian bergabung dengan mereka dengan pemisah yang Anda suka:
harus bekerja seperti pesona.
sumber
Tangkapan semua:
sumber
rstrip
tidak mengambil ekspresi reguler."hi|||\n\n".rstrip("\r|\n")
kembali"hi"