2008-10-05 54 views

Trả lời

267
inputString.splitlines() 

Sẽ cung cấp cho bạn một danh sách với mỗi mục, phương pháp splitlines() được thiết kế để chia từng dòng thành một phần tử danh sách.

+12

+1. Tôi nghĩ rằng đây là đẹp hơn so với giải pháp được chấp nhận bởi vì nó không gây rối với bộ tách dòng một cách rõ ràng. Tất cả chỉ hoạt động với một phương pháp API chuyên dụng! – lpapp

+7

@lpapp, tôi hoàn toàn đồng ý. splitlines() là ngữ nghĩa (và chức năng, vì nó sử dụng các dòng mới phổ quát và bỏ qua một dòng trống sau) tốt hơn so với phân tách ('\ n'). Trở lại sau đó (2008) Tôi chỉ là một newbie Pythonista và grepping mặc dù kịch bản của tôi bây giờ cho thấy rằng tôi cũng đang sử dụng splitlines() gần như độc quyền. Do đó, tôi xóa câu trả lời 104 điểm của mình (_ * sob ... * _) và sẽ xác nhận câu trả lời này thay thế. – efotinis

+14

Điều này cũng làm cho ''' .splitlines() == []', không phải '['']' giống với ''' .split ('\ n')'. – rightfold

190

Giống như những người khác nói:

inputString.split('\n') # --> ['Line 1', 'Line 2', 'Line 3'] 

này giống hệt như trên, nhưng chức năng module chuỗi của đang bị phản đối và nên tránh:

import string 
string.split(inputString, '\n') # --> ['Line 1', 'Line 2', 'Line 3'] 

Ngoài ra, nếu bạn muốn mỗi dòng để bao gồm chuỗi ngắt (CR, LF, CRLF), sử dụng phương pháp splitlines với đối số True:

inputString.splitlines(True) # --> ['Line 1\n', 'Line 2\n', 'Line 3'] 
+8

Điều này sẽ chỉ hoạt động trên các hệ thống sử dụng '\ n' làm trình kết thúc dòng. –

+19

@Jeremy: Các chuỗi chữ được trích dẫn ba lần luôn sử dụng EOL '\ n', bất kể nền tảng là gì. Vì vậy, các tập tin đọc ở chế độ văn bản. – efotinis

+3

liên kết đến phương thức: http://docs.python.org/2/library/stdtypes.html#str.splitlines –

17

Có thể là quá mức cần thiết trong trường hợp đặc biệt này nhưng tùy chọn khác bao gồm việc sử dụng StringIO để tạo ra một tập tin giống như đối tượng

for line in StringIO.StringIO(inputString): 
    doStuff() 
+0

Vâng, đây là cách tiếp cận thành ngữ nhất, đơn giản nhất của Python. –

+3

Một lợi thế của phương pháp này, khi so sánh với 'str.split', là ** không cần phân bổ bộ nhớ nào ** (nó đọc chuỗi tại chỗ). Một bất lợi là nó ** chậm hơn nhiều nếu bạn sử dụng 'StringIO' ** (khoảng 50x). Nếu bạn sử dụng ** 'cStringIO', tuy nhiên, nó nhanh hơn gấp 2 lần ** – goncalopp

39

Cách tốt nhất để làm điều này là để chỉ cần sử dụng str.splitlines.

splitlines() xử lý dòng mới đúng cách, không giống như split("\n").

Nó cũng có lợi thế được đề cập bởi @efotinis tùy chọn bao gồm ký tự dòng mới trong kết quả phân tách khi được gọi với đối số True.


lời giải thích chi tiết về lý do tại sao bạn không nên sử dụng split("\n"):

\n, bằng Python, đại diện cho một dòng Unix-break (mã ASCII thập phân 10), độc lập với nền tảng nơi bạn chạy nó . Tuy nhiên, the linebreak representation is platform-dependent. Trên Windows, \n là hai ký tự, CRLF (mã thập phân ASCII 13 và 10, AKA \r\n), trong khi trên bất kỳ Unix hiện đại nào (bao gồm OS X), đó là ký tự đơn LF.

print, ví dụ, hoạt động chính xác ngay cả khi bạn có một chuỗi với kết thúc dòng không phù hợp với nền tảng của bạn:

>>> print " a \n b \r\n c " 
a 
b 
c 

Tuy nhiên, việc tách một cách rõ ràng về "\ n", sẽ mang lại nền tảng phụ thuộc hành vi:

>>> " a \n b \r\n c ".split("\n") 
[' a ', ' b \r', ' c '] 

Thậm chí nếu bạn sử dụng os.linesep, nó sẽ chỉ chia theo các dấu phân cách xuống dòng trên nền tảng của bạn, và sẽ thất bại nếu bạn đang xử lý văn bản được tạo ra trong các nền tảng khác, hoặc với một trần \n:

>>> " a \n b \r\n c ".split(os.linesep) 
[' a \n b ', ' c '] 

splitlines giải quyết tất cả những vấn đề này:

>>> " a \n b \r\n c ".splitlines() 
[' a ', ' b ', ' c '] 

Reading files in text mode phần giảm nhẹ vấn đề đại diện xuống dòng, vì nó chuyển đổi Python của \n thành đại diện xuống dòng của nền tảng. Tuy nhiên, chế độ văn bản chỉ tồn tại trên Windows. Trên các hệ thống Unix, tất cả các tệp được mở ở chế độ nhị phân, do đó việc sử dụng split('\n') trong hệ thống UNIX có tệp Windows sẽ dẫn đến hành vi không mong muốn. Ngoài ra, nó không phải là bất thường để xử lý các chuỗi với các dòng mới có khả năng khác nhau từ các nguồn khác, chẳng hạn như từ một ổ cắm.

+0

So sánh là không công bằng vì bạn có thể sử dụng split (os.linesep) để tránh bit nền tảng cụ thể. – lpapp

+4

@lpapp lưu ý rằng 'splitlines' sẽ chia thành * bất kỳ * dòng nào kết thúc. 'split (os.linesep)' sẽ thất bại khi đọc một tập tin windows trong unix, ví dụ – goncalopp

+0

Một lý do khác để sử dụng splitline trong trường hợp của tôi, cảm ơn. Tôi đã +1. Tôi sẽ cá nhân thậm chí kết hợp các thông tin trong các ý kiến ​​vào câu trả lời của bạn. – lpapp

1

Tôi muốn nhận xét có định dạng văn bản mã thích hợp, bởi vì tôi nghĩ câu trả lời của @ 1_CR cần nhiều va chạm hơn và tôi muốn tăng thêm câu trả lời của anh ấy. Dù sao, Ngài đã dẫn tôi đến kỹ thuật sau; nó sẽ sử dụng cStringIO nếu có (NHƯNG LƯU Ý: cStringIO và StringIO là không giống nhau, vì bạn không thể phân lớp cStringIO ... nó là một built-in ... nhưng đối với các hoạt động cơ bản cú pháp sẽ giống nhau, vì vậy bạn có thể làm điều này):

try: 
    import cStringIO 
    StringIO = cStringIO 
except ImportError: 
    import StringIO 

for line in StringIO.StringIO(variable_with_multiline_string): 
    pass 
print line.strip() 
Các vấn đề liên quan