Câu hỏi Làm thế nào tôi có thể loại bỏ (chomp) một dòng mới trong Python?


Tương đương Python của Perl là gì chomp chức năng, mà loại bỏ các ký tự cuối cùng của một chuỗi nếu nó là một dòng mới?


1331
2017-11-08 18:25


gốc


Xem thêm stackoverflow.com/questions/2572/… - Greg Hewgill
OK, tôi đã làm lại nó để mọi người không đánh dấu bạn quá nhiều :) Chào mừng bạn đến Stack Overflow, ngoài một vài quy tắc lạ như thế này, nó là một nơi khá thân thiện và hợp lý! - Rich Bradshaw
@Sorin Sbarnea rstrip ('\ n') hoạt động với Python3. - weakish
"Ký tự cuối cùng của một giá trị" là gì? Điều gì làm chomp làm: loại bỏ tất cả các dòng mới, hoặc một trailing newline? - Ciro Santilli 新疆改造中心 六四事件 法轮功
Superset: bất kỳ chuỗi nào thay vì chỉ dòng mới: stackoverflow.com/questions/1038824/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Các câu trả lời:


Thử phương pháp rstrip() (xem tài liệu Python 2 và Python 3)

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

Python rstrip() dải phương pháp tất cả các loại khoảng trống theo sau theo mặc định, không chỉ một dòng mới như Perl thực hiện với chomp.

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

Để chỉ tách các dòng mới:

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

Ngoài ra còn có các phương pháp lstrip() và 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'

1394
2017-11-09 05:52



Tôi không phải là một người Python vì vậy tôi không có câu trả lời cho điều này, nhưng chomp của Perl () thực sự loại bỏ các bản ghi đầu vào tách từ cuối. Đó là một dòng mới trên những thứ Unixy, nhưng có thể khác (ví dụ: Windows) và nó có thể thay đổi. Có cách nào để loại bỏ giá trị đó chỉ một lần từ cuối chuỗi không? - brian d foy
brian d foy: Python không có bộ tách bản ghi đầu vào như awk và Perl. - Peter Hosey
Có \ n đủ không? >>> "chuỗi thử nghiệm \ r \ n" .rstrip ("\ n") 'chuỗi kiểm tra \ r' - Andrew Grimm
@csde_rats, điều đó không đúng: OS X sử dụng \n cho các dòng mới giống như Unix. (Trước OS X, MacOS đã sử dụng \r như một dấu tách dòng, nhưng điều đó đã kết thúc cách đây 10 năm.) - skue
@briandfoy Python đã tích hợp sẵn hỗ trợ cho các dòng mới (chỉ khi đọc, không phải khi viết). Bạn mở tệp ở chế độ "U" hoặc "rU", và sau đó bất kể Windows, Linux, Mac, bất cứ điều gì, vào lúc văn bản đến mã python của bạn, mọi kiểu dòng mới đã được thay thế bằng "\ n". Xem: python.org/dev/peps/pep-0278 - AlcubierreDrive


Và tôi sẽ nói cách "pythonic" để lấy các dòng mà không có các ký tự dòng mới là các đường phân tách ().

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



Không phải nếu bạn sử dụng fd.readlines () hoặc tương tự. - Dirk
chú thích: str.splitlines() xử lý như newlines nhiều nhân vật (không chỉ \r, \n) - jfs


Cách kinh điển để tách các ký tự end-of-line (EOL) là sử dụng phương thức rstrip () của chuỗi để xóa bất kỳ dấu \ r hoặc \ n nào. Dưới đây là các ví dụ cho các ký tự Mac, Windows và 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'

Sử dụng '\ r \ n' làm tham số để rstrip có nghĩa là nó sẽ loại bỏ bất kỳ kết hợp đuôi '\ r' hoặc '\ n' nào. Đó là lý do tại sao nó hoạt động trong cả ba trường hợp trên.

Sắc thái này quan trọng trong những trường hợp hiếm hoi. Ví dụ, tôi đã từng xử lý một tập tin văn bản có chứa một thông điệp HL7. Tiêu chuẩn HL7 yêu cầu dấu '\ r' làm ký tự EOL của nó. Máy tính Windows mà tôi đang sử dụng thông báo này đã gắn thêm ký tự EOL của nó. Do đó, cuối mỗi dòng trông giống như '\ r \ r \ n'. Sử dụng rstrip ('\ r \ n') sẽ loại bỏ toàn bộ '\ r \ r \ n' mà không phải là thứ tôi muốn. Trong trường hợp đó, tôi chỉ đơn giản là cắt bỏ hai ký tự cuối cùng thay vào đó.

Lưu ý rằng không giống như Perl chomp chức năng này sẽ xóa tất cả các ký tự được chỉ định ở cuối chuỗi chứ không phải chỉ một:

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

126
2017-11-28 17:31



Lưu ý rằng các ứng dụng Mac OS X hiện đại sử dụng \ n. Chỉ các ứng dụng Carbon cũ được viết ban đầu để sử dụng Mac OS \ r. - Peter Hosey
Cảm ơn bạn đã làm rõ. Tất nhiên, rstrip ('\ r \ n') vẫn hoạt động trong trường hợp đó. - Mike
Cũng có os.linesep, chứa trình tự EOL cho hệ điều hành hiện tại. - Eli Collins
Đây là câu trả lời hay nhất: chỉ có dải các dòng mới và thực hiện chính xác cho các nền tảng phổ biến nhất. - kevinarpe
plus +1 Để sử dụng \n và \r - fechnert


Lưu ý rằng rstrip không hoạt động chính xác như chomp của Perl () vì nó không sửa đổi chuỗi. Tức là, trong Perl:

$x="a\n";

chomp $x

kết quả trong $x đang được "a".

nhưng bằng Python:

x="a\n"

x.rstrip()

sẽ có nghĩa là giá trị của x Là vẫn  "a\n". Cũng x=x.rstrip() không phải lúc nào cũng đưa ra kết quả tương tự, vì nó chặn tất cả khoảng trống từ cuối chuỗi, không chỉ một dòng mới nhất.


96
2018-03-07 16:07



Ngoài ra, strip () loại bỏ các ký tự lặp đi lặp lại, trong khi chop / chomp chỉ loại bỏ một dòng mới - kostmo
Ah có, dây là không thay đổi, cảm ơn cho lời nhắc nhở! - Brian Peterson


Tôi có thể sử dụng một cái gì đó như thế này:

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

Tôi nghĩ vấn đề với rstrip("\n") là có thể bạn sẽ muốn đảm bảo bộ tách dòng là di động. (một số hệ thống cũ được đồn đại sử dụng "\r\n"). Bí quyết khác là rstrip sẽ loại bỏ khoảng trắng lặp lại. Hy vọng os.linesep sẽ chứa các ký tự phù hợp. các công trình trên cho tôi.


46
2018-05-13 16:41



Tuy nhiên, điều này sẽ không hoạt động nếu bạn đang cố dọn dẹp nội dung do người dùng gửi trong ứng dụng web. Nội dung của người dùng có thể đến từ bất kỳ nguồn nào và chứa bất kỳ ký tự dòng mới nào. - apiguy
Điểm tốt, ngoại trừ việc bạn có thể xử lý các tập tin 'nước ngoài' (từ các hệ thống cũ) trên hệ điều hành hiện đại của bạn. - ChuckCottrill
Cũng nên nhớ rằng nếu bạn đang đọc một tệp ở chế độ văn bản, điều này cũng sẽ không hoạt động trên hệ thống Windows vì ký tự sau sẽ luôn được chuyển thành '\ n'. - Mad Physicist


Bạn có thể sử dụng line = line.rstrip('\n'). Điều này sẽ loại bỏ tất cả các dòng mới từ cuối chuỗi, không chỉ một.


37
2018-03-09 08:02





s = s.rstrip()

sẽ xóa tất cả các dòng mới ở cuối chuỗi s. Bài tập là cần thiết vì rstrip trả về một chuỗi mới thay vì sửa đổi chuỗi gốc.


28
2018-02-29 22:40





"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

hoặc bạn có thể luôn geekier với regexps :)

chúc vui vẻ!


23
2017-11-21 04:29



Điều này làm việc tuyệt vời cho tôi cố gắng nhanh chóng biến một tập tin văn bản với dòng kết thúc thành một dòng văn bản. Tôi là một người mới, vì vậy không chắc chắn nếu có một cách tốt hơn để làm điều đó, nhưng nó đã làm việc, cảm ơn! (Dải dường như chỉ hoạt động từ các đầu, không phải trong nội bộ) - Steve Koch
Tại sao không chỉ sử dụng một câu lệnh thay thế, như .replace('\n|\r', '')? - Doorknob
@Doorknob không hoạt động - mihaicc
Chỉ trong trường hợp bất cứ ai khác muốn sử dụng ý tưởng từ @DoorknobofSnow, nó chỉ là một thay đổi nhỏ để sử dụng mô-đun regex: import re  re.sub('\n|\r', '', '\nx\n\r\n') ==> 'x'. - Taylor Edmiston
Sử dụng kỹ thuật này và regex như @TaylorEdmiston đã đề cập nên là câu trả lời đúng. - Bhargav


bạn có thể sử dụng dải:

line = line.strip()

bản giới thiệu:

>>> "\n\n hello world \n\n".strip()
'hello world'

19
2018-04-27 11:43



Đã thử giải pháp này nhưng nó loại bỏ khoảng trống hàng đầu trong dòng. - Tarik
@ Tarik bạn có thể sử dụng rstrip - Hackaholic
rstrip sẽ xóa tất cả khoảng trống ở cuối, không giống như chomp mà chỉ xóa ít nhất một dòng mới. - Flimm