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ự, CR
và LF
(mã thập phân ASCII 13 và 10, AKA \r
và \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.
+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
@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
Điều này cũng làm cho ''' .splitlines() == []', không phải '['']' giống với ''' .split ('\ n')'. – rightfold