Làm thế nào tôi có thể loại bỏ một dòng mới?


1689

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


2
Superset: bất kỳ chuỗi nào thay vì chỉ dòng mới: stackoverflow.com/questions/1038824/NH
Ciro Santilli 病毒 审查 六四 事件

3
Câu trả lời A + là, nếu điều này là do quên open()một tệp có tham số 'newline = ...' thích hợp cho nền tảng của bạn (hỗ trợ dòng mới phổ quát), bạn có thể không cần phải xóa nó một cách rõ ràng.
smci

Câu trả lời:


1868

Hãy thử phương thức rstrip()(xem doc Python 2Python 3 )

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

rstrip()Phương thức của Python loại bỏ tất cả các loại khoảng trắng theo mặc định, không chỉ là một dòng mới như Perl làm với chomp.

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

Để loại bỏ 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 thức lstrip()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'

22
Tôi không phải là người Python nên tôi không có câu trả lời cho điều này, nhưng chomp () của Perl thực sự xóa dấu tách bản ghi đầu vào từ cuối. Đó là một dòng mới về 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

5
brian d foy: Python không có trình phân tách bản ghi đầu vào như awk và Perl có.
Peter Hosey

7
@csde_rats, điều đó không đúng: OS X sử dụng \ncho các dòng mới giống như Unix. (Trước OS X, MacOS đã sử dụng \rnhư một trình phân tách dòng, nhưng điều đó đã kết thúc 10 năm trước.)
skue

21
@briandfoy Python có hỗ trợ tích hợp cho dòng mới Universal (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ứ khi nào, văn bản đạt đến mã python của bạn, bất kỳ kiểu dòng mới nào cũng được thay thế bằng "\ n". Xem: python.org/dev/peps/pep-0278
AlcubierreDrive

12
Tôi sẽ tiếp tục và đánh vần điều này bởi vì tôi là một người mới và tôi đã dành một lúc để tự hỏi tại sao nó không hoạt động. .strip()không làm thay đổi chuỗi (có thể có liên quan đến chuỗi không thay đổi). Nếu không có trong dòng lệnh, bạn sẽ muốn"string = string.strip()"
Script Kitty


146

Cách chính tắc để loại bỏ các ký tự cuối dòng (EOL) là sử dụng phương thức chuỗi rstrip () loại bỏ mọi dấu vết \ r hoặc \ n. Dưới đây là 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ố cho rstrip có nghĩa là nó sẽ loại bỏ mọi kết hợp kéo dài của '\ r' hoặc '\ n'. Đó 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 phải xử lý một tệp văn bản chứa thông điệp HL7. Tiêu chuẩn HL7 yêu cầu dấu '\ r' là ký tự EOL của nó. Máy Windows mà tôi đang sử dụng tin nhắn này đã thêm ký tự EOL '\ r \ n' của chính nó. Do đó, phần cuối của 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' không phải là điều 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 thế.

Lưu ý rằng không giống như chompchức năng của Perl , điều này sẽ loại bỏ tất cả các ký tự được chỉ định ở cuối chuỗi, không chỉ một:

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

7
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ũ ban đầu được viết cho Mac OS mới sử dụng \ r.
Peter Hosey

2
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

13
Ngoài ra còn os.linesepcó trình tự EOL cho HĐH hiện tại.
Eli Collins

Đây là câu trả lời tốt nhất: Nó chỉ loại bỏ 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

cộng +1 để sử dụng \n\r
fechert

99

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. Đó là, trong Perl:

$x="a\n";

chomp $x

dẫn đến $xbị "a".

nhưng trong Python:

x="a\n"

x.rstrip()

sẽ có nghĩa rằng giá trị của xvẫn "a\n" . Thậm chí x=x.rstrip()không phải lúc nào cũng cho kết quả giống nhau, vì nó loại bỏ tất cả khoảng trắng từ cuối chuỗi, không chỉ một dòng mới nhất.


7
Ngoài ra, dải () loại bỏ các ký tự lặp đi lặp lại, trong khi chop / chomp chỉ xóa một dòng mới
kostmo

50

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ó lẽ bạn sẽ muốn đảm bảo rằng dấu phân cách dòng là di động. (một số hệ thống cổ xưa được đồn đại sẽ sử dụng "\r\n"). Gotcha khác là rstripsẽ loại bỏ khoảng trắng lặp đi lặp lại. Hy vọng os.linesepsẽ chứa các nhân vật đúng. các công việc trên cho tôi.


12
Điều này sẽ không hoạt động tuy nhiên nếu bạn đang cố gắng dọn sạch nội dung do người dùng gửi trong ứng dụng web. Nội dung 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

2
Điểm hay, ngoại trừ việc bạn có thể đang xử lý các tệp '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

1
Cũng nên nhớ rằng nếu bạn đang đọc 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, bởi vì ký tự dấu sẽ luôn được chuyển đổi thành '\ n'.
Nhà vật lý điên

@MadPhysicist Bạn đúng khi chuyển đổi nó, nhưng nó vẫn hoạt động vì nó giống rstrip('\r\n')rstrip()sẽ loại bỏ bất kỳ ký tự nào trong đối số.
dtauxe

41

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.


35
s = s.rstrip()

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


33

Điều này sẽ sao chép chính xác chomp của perl (trừ hành vi trên mảng) cho đầu cuối dòng "\ 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

(Lưu ý: nó không sửa đổi chuỗi 'tại chỗ'; nó không xóa khoảng trắng theo dõi thêm; mất \ r \ n trong tài khoản)


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

hoặc bạn luôn có thể trở nên đam mê với regexps :)

chúc vui vẻ!


Điều này làm việc rất tốt cho tôi khi cố gắng nhanh chóng biến một tệp văn bản có kết thúc dòng 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 có cách nào tốt hơn để làm điều đó không, nhưng nó đã hoạt động, cảm ơn! (Dải dường như chỉ hoạt động từ cuối, không phải trong nội bộ)
Steve Koch

2
Tại sao không chỉ sử dụng một tuyên bố thay thế, như thế .replace('\n|\r', '')nào?
Doorknob

2
Chỉ trong trường hợp bất kỳ ai khác muốn sử dụng ý tưởng từ @DoorknobofSnow, đó 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 sẽ là câu trả lời thích hợp.
Bhargav

@Bhargav Tôi đã thêm câu trả lời cho câu hỏi này dựa trên nhận xét này như bạn đã đề xuất đồng thời khám phá một vài tùy chọn liên quan khác. Tôi cũng đã làm rõ lý do tại sao tôi nghĩ regex là một giải pháp tốt hơn cho vấn đề này hơn str.rstrip vì đó là những gì hầu hết các câu trả lời sử dụng.
Taylor Edmiston

27

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'

1
Đã 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ả các khoảng trắng ở cuối, không giống như chomp chỉ xóa tối đa một dòng mới.
Flimm

20

rstrip không làm điều tương tự như chomp, trên nhiều cấp độ. Đọc http://perldoc.perl.org/fifts/chomp.html và thấy rằng chomp thực sự rất phức tạp.

Tuy nhiên, điểm chính của tôi là chomp loại bỏ tối đa 1 dòng kết thúc, trong khi rstrip sẽ loại bỏ càng nhiều càng tốt.

Tại đây bạn có thể thấy rstrip xóa tất cả các dòng mới:

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

Một xấp xỉ gần đúng hơn của việc sử dụng chomp Perl điển hình có thể được thực hiện với re.sub, như thế này:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'

2
Kudos, bạn là người duy nhất chỉ ra chi tiết rất quan trọng này. Tuy nhiên, như ai đó đã lưu ý, sử dụng os.linesep sẽ không hoạt động nếu bạn đang đọc các tệp từ một hệ thống khác. Điều này có thể mất thêm một chút công việc trong Python, thực sự kiểm tra đến cuối dòng.
brianmearn

19

Cẩn thận với "foo".rstrip(os.linesep): Điều đó sẽ chỉ kiểm tra các ký tự dòng mới cho nền tảng nơi Python của bạn đang được thực thi. Ví dụ, hãy tưởng tượng bạn đang tinh chỉnh các dòng của một tệp Windows trong Linux:

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

Sử dụng "foo".rstrip("\r\n")thay thế, như Mike nói ở trên.


Một điều khác cần lưu ý là nó không loại bỏ tối đa một dòng mới, nhưng tất cả các dòng mới, không giống như chomp.
Flimm

19

Một ví dụ trong tài liệu của Python chỉ đơn giản là sử dụng line.strip().

chompHàm của Perl sẽ loại bỏ một chuỗi ngắt dòng từ cuối chuỗi chỉ khi nó thực sự ở đó.

Đây là cách tôi dự định thực hiện điều đó trong Python, nếu processvề mặt khái niệm là chức năng mà tôi cần để làm điều gì đó hữu ích cho mỗi dòng từ tệp này:

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)

2
Cuối cùng, một câu trả lời chỉ loại bỏ nó một lần (như chomp thực tế ...) và là hệ điều hành di động!
Ciro Santilli 冠状 病毒 审查 事件


10
import re

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

2
Điều này cũng sẽ loại bỏ khoảng trắng tab, mà câu hỏi ban đầu không yêu cầu. (Do ký tự \ t)
NoahR

9

Tôi thấy thuận tiện khi có thể nhận được các dòng được chia nhỏ trong iterator, song song với cách bạn có thể nhận được các dòng không được phân tách từ một đối tượng tệp. Bạn có thể làm như vậy với mã sau:

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

Sử dụng mẫu:

with open("file.txt") as infile:
    for line in chomped_lines(infile):
        process(line)

Lưu ý: Với operator.methodcallermap( itertools.imaptrên Py2), bạn có thể đẩy công việc này lên lớp C, tránh mã trình tạo mức Python (và do đó chạy nhanh hơn một chút, mặc dù thừa nhận rằng I / O có thể che giấu mức tăng nhỏ) : for line in map(operator.methodcaller('rstrip', '\r\n'), infile):. Nó có thể vẫn còn là yếu tố def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it).
ShadowRanger

8

giải pháp khắc phục cho trường hợp đặc biệt:

nếu ký tự dòng mới là ký tự cuối cùng (như trường hợp của hầu hết các đầu vào tệp), thì đối với bất kỳ phần tử nào trong bộ sưu tập, bạn có thể lập chỉ mục như sau:

foobar= foobar[:-1]

để cắt ra nhân vật dòng mới của bạn.


3
Đôi khi dòng mới không phải ký tự cuối cùng, mà là dòng cuối cùng, đặc biệt trên các cửa sổ, như những người khác đã chỉ ra.
Cacovsky

8

Nếu câu hỏi của bạn là dọn sạch tất cả các ngắt dòng trong một đối tượng str nhiều dòng (oldstr), bạn có thể chia nó thành một danh sách theo dấu phân cách '\ n' và sau đó nối danh sách này vào một str mới (newstr).

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


7

Có vẻ như không có một sự tương tự hoàn hảo cho chomp của perl . Đặc biệt, rstrip không thể xử lý các dấu phân cách dòng mới nhiều ký tự như thế nào \r\n. Tuy nhiên, splitlines không được chỉ ra ở đây . Theo câu trả lời của tôi cho một câu hỏi khác, bạn có thể kết hợp nốichia dòng để xóa / thay thế tất cả các dòng mới từ một chuỗi s:

''.join(s.splitlines())

* Gỡ bỏ sau đúng một dấu xuống dòng (như chomp sẽ, tôi tin). Chuyển qua Truelàm keependsđối số để phân chia giữ lại các dấu phân cách. Sau đó, splitlines được gọi một lần nữa để xóa các dấu phân cách trên "dòng" cuối cùng:

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

7

Tôi đang làm nổi lên câu trả lời thường xuyên của mình dựa trên câu trả lời mà tôi đã đăng trước đó trong phần bình luận của câu trả lời khác. Tôi nghĩ rằng sử dụng relà một giải pháp rõ ràng rõ ràng hơn cho vấn đề này hơn str.rstrip.

>>> import re

Nếu bạn muốn loại bỏ một hoặc nhiều trailing chars xuống dòng:

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

Nếu bạn muốn xóa ký tự dòng mới ở mọi nơi (không chỉ theo dõi):

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

Nếu bạn muốn loại bỏ chỉ 1-2 ký tự ký tự dòng mới (ví dụ \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'

Tôi có cảm giác rằng hầu hết mọi người thực sự muốn ở đây, là loại bỏ chỉ một lần xuất hiện của một nhân vật dòng mới, hoặc \r\nhoặc \nkhông có gì nữa.

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

(Việc ?:tạo một nhóm không bắt giữ.)

(Bằng cách này là không'...'.rstrip('\n', '').rstrip('\r', '')không mà có thể không được rõ ràng cho người khác vấp ngã khi chủ đề này. str.rstripDải như nhiều nhân vật trailing càng tốt, do đó, một chuỗi như foo\n\n\nsẽ cho kết quả dương tính giả của footrong khi bạn có thể đã muốn giữ gìn các dòng mới khác sau khi tước một dấu duy nhất.)


Bạn có thể bỏ qua nhóm không bắt giữ, ngay cả đối với phương pháp cuối cùng của bạn, với biểu thức chính quy r'\r?\n$'. Có khả năng hiệu quả hơn, vì các công cụ regex có thời gian tối ưu hóa thay thế khó hơn. Cũng lưu ý rằng nếu bạn sẽ thực hiện việc này nhiều lần, nó sẽ nhanh hơn đáng kể (đặc biệt là nếu bạn xen kẽ với các remục đích sử dụng khác ) vào re.compilebiểu thức một lần trước, sau đó sử dụng subphương thức của đối tượng regex đã biên dịch; các chức năng mô-đun là mức Python và kiểm tra bộ đệm cho các biểu thức chính được biên dịch trước (tạo / lưu vào bộ đệm nếu thiếu), sau đó gọi phương thức khớp; bỏ qua việc tra cứu đó giúp.
ShadowRanger

1
Ngoài ra, lưu ý phụ: Vì bạn đang cố gắng khớp \ntrực tiếp, nên bạn có thể muốn sử dụng \Zhơn $(hoặc chỉ khớp \r?$, vì $hoàn toàn có thể khớp ngay trước dòng mới ở cuối chuỗi).
ShadowRanger

5
>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'

Ví dụ tôi cần! Vì vậy, rstrip ("\ r \ n") sẽ loại bỏ cả '\ n' và '\ r' trong bất kỳ kết hợp nào ở cuối dòng!
Agostino

@Agostino Không cần cung cấp "\r\n"Ví dụ: ' spacious \n\r\n\r \n\n'.rstrip()sản xuất' spacious'
olibre

2
@olibre mã bạn đề xuất cũng sẽ loại bỏ các ký tự trống / khoảng trắng khác, có thể không phải là những gì người ta cần. Trong thực tế, tôi chỉ cần loại bỏ sự kết hợp của các nhân vật eol. Tuy nhiên, cảm ơn vì đã chỉ ra điều này.
Agostino

4

Chỉ dùng :

line = line.rstrip("\n")

hoặc là

line = line.strip("\n")

Bạn không cần bất kỳ thứ phức tạp này


2
Lưu ý rằng điều này không giống như 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'

Với regex

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

Thay thế \ n, \ t, \ r

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

Với regex

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

với tham gia

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

3

Có ba loại kết thúc dòng mà chúng ta thường gặp phải: \n, \r\r\n. Một biểu thức chính quy khá đơn giản trong re.sub, cụ thể là r"\r?\n?$", có thể bắt được tất cả.

(Và chúng ta phải bắt hết chúng , phải không?)

import re

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

Với đối số cuối cùng, chúng tôi giới hạn số lần xuất hiện được thay thế thành một, bắt chước chomp ở một mức độ nào đó. Thí dụ:

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)

... nơi a == b == cTrue.


Bạn thậm chí không cần biểu thức chính quy đầy đủ. rstrip("\r\n")là một bắt tất cả. Hãy thử print(text_2.rstrip('\r\n')).
Agostino

@Agostino: Đúng, cho rằng str.rstrip()giải quyết vấn đề. Nó phụ thuộc vào nhu cầu của bạn. Giải pháp này được đặc biệt được thực hiện cho các trường hợp khi bạn cần phải loại bỏ chỉ là cuối cùng "\n", "\r"hoặc "\r\n"nhưng không phải tất cả trong số họ (nếu có nhiều "\n"trong chuỗi). re.sub(r"\r?\n?$", "", text_1, 1)trả về "hellothere\n\n"text_1.rstrip("\r\n")trả về "hellothere"đó là một chuỗi khác nhau.
internet

Những gì tôi đang cố gắng nói là: đó str.strip()là một vấn đề đôi khi là vấn đề.
internet

1

Nếu bạn lo lắng về tốc độ (giả sử bạn có một danh sách các chuỗi looong) và bạn biết bản chất của char dòng mới, việc cắt chuỗi thực sự nhanh hơn rstrip. Một thử nghiệm nhỏ để minh họa điều này:

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

Đầu ra:

Method 1: 3.92700004578
Method 2: 6.73000001907

Tôi biết có lẽ tôi nên sử dụng "vòng lặp toàn cầu" bên trong các chức năng, nhưng điều này cũng hoạt động.
Stephen Miller

Kiểm tra điều này là sai và không công bằng .. Trong method1bạn chỉ đang chặt ra ký tự cuối cùng, không có vấn đề gì, trong method2các .rstrip()kiểm tra đầu tiên, nếu sự kết thúc của chuỗi chứa các ký tự không mong muốn và chops chúng, chỉ khi một số đã được tìm thấy. Vui lòng thực hiện một số kiểm tra cho các nhân vật trong method1và kiểm tra agin!
spky

Như tôi đã nói trong phần giới thiệu cho câu trả lời: Nếu bạn biết bản chất của char dòng mới, thì điều này rất hữu ích. Nếu bạn không đồng ý, rõ ràng bạn cần thực hiện một số loại kiểm tra ký tự - hoặc chỉ sử dụng rstrip. Tôi không có nghĩa là "không công bằng" đối với rstrip, mà chỉ đơn giản là minh họa một sự khác biệt không đáng kể có thể đáng xem xét trong một số tình huống.
Stephen Miller

1

Điều này sẽ hoạt động cho cả windows và linux (bit đắt với re sub nếu bạn đang tìm kiếm giải pháp re)

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


3
Tại sao sử dụng re.searchnơi bạn chỉ cần re.sub?
wjandrea

0

Các dòng đầu tiên sau đó nối chúng với bất kỳ dấu phân cách nào bạn muốn:

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

nên làm việc như một lá bùa.


-1

Bắt tất cả:

line = line.rstrip('\r|\n')

5
rstripkhông có biểu hiện thường xuyên. "hi|||\n\n".rstrip("\r|\n")trở về"hi"
Flimm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.