2008-12-04 76 views

Trả lời

44

Các ngữ cách để làm điều này trong Python là sử dụng rstrip ('\ n'):

for line in open('myfile.txt'): # opened in text-mode; all EOLs are converted to '\n' 
    line = line.rstrip('\n') 
    process(line) 

Mỗi phòng trong số lựa chọn thay thế khác có một Gotcha:

  • tập tin ('...'). read(). splitlines() phải tải toàn bộ tập tin trong bộ nhớ cùng một lúc.
  • dòng = dòng [: - 1] sẽ thất bại nếu dòng cuối cùng không có EOL.
+15

HTTP và các giao thức khác chỉ định '\ r \ n' cho kết thúc dòng, vì vậy bạn nên sử dụng line.rstrip ('\ r \ n') cho độ mạnh. –

+0

Cảm ơn sự giúp đỡ của bạn! Tôi cần phải mở một tập tin văn bản và tôi đã ngạc nhiên khi thấy rằng \ n - điều thậm chí là bằng Python như trong Perl, C và rất nhiều ngôn ngữ khác. Tôi sẽ đánh dấu trang này và không bao giờ quên nó. – bjd2385

5

Có vấn đề gì với mã của bạn? Tôi thấy nó khá thanh lịch và đơn giản. Vấn đề duy nhất là nếu tập tin không kết thúc bằng một dòng mới, dòng cuối cùng trả về sẽ không có một ký tự cuối cùng là '\n', và do đó làm line = line[:-1] sẽ loại bỏ không chính xác ký tự cuối cùng của dòng.

Cách thanh lịch nhất để giải quyết vấn đề này sẽ được xác định một máy phát điện mà mất theo dòng của các tập tin và loại bỏ các ký tự cuối cùng từ mỗi dòng chỉ khi nhân vật đó là một dòng mới:

def strip_trailing_newlines(file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line in strip_trailing_newlines(f): 
    # do something with line 
+3

file Mac sử dụng '\ r', cửa sổ sử dụng '\ r \ n', nó bắt đầu để có được chunky. Tốt hơn nhiều khi sử dụng str.rstrip() –

+2

Nếu tệp được mở ở chế độ văn bản, kết thúc dòng gốc của nền tảng sẽ được tự động chuyển đổi thành một '\ n' khi chúng được đọc. Và chỉ có _really old_ Mac OS sử dụng đồng bộ '\ r '. Bạn không thể sử dụng rstrip() nếu bạn muốn giữ lại dấu cách và các tab. –

+0

Ý tưởng hay, với máy phát điện. Sẽ có ích trong thư viện có thể tái sử dụng. Tôi sẽ kết hợp giải pháp của bạn với giải pháp efonitis '(để lưu if: else :). Nếu không có thư viện có thể tái sử dụng, tôi sẽ thích giải pháp efotinis (sử dụng line.rstrip ('\ n')). – pythonquick

17

đơn giản. Sử dụng splitlines()

L = open("myFile.txt", "r").read().splitlines(); 
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end 
+4

Nhưng lưu ý rằng điều này tải toàn bộ tệp vào bộ nhớ trước, điều này có thể khiến nó không phù hợp với một số trường hợp. –

+0

@Matthew: Vâng, bạn nói đúng. –

+1

làm cho nó chính xác phù hợp với tôi, cảm ơn –

2

Bạn cũng có thể xem xét sử dụng line.rstrip() để loại bỏ các khoảng trắng ở cuối dòng của bạn.

+0

Tôi cũng sử dụng rstrip(), nhưng bạn phải nhớ rằng nó cũng lấy ra các dấu cách và các tab –

+0

Như efotinis đã hiển thị, nếu bạn chỉ định đối số ký tự, bạn có thể xác định để dải. Từ tài liệu: "" "rstrip ([ký tự]) Đối số ký tự là một chuỗi chỉ định bộ ký tự cần xóa. Nếu bỏ qua hoặc Không, đối số ký tự mặc định sẽ xóa khoảng trắng." "" – monkut

3

thời gian dài trước đây, đã có thân mến, sạch, cũ, mã BASIC có thể chạy trên máy lõi 16 kb: như thế:

if (not open(1,"file.txt")) error "Could not open 'file.txt' for reading" 
while(not eof(1)) 
    line input #1 a$ 
    print a$ 
wend 
close 

Bây giờ, để đọc một dòng tập tin bằng cách dòng, với phần cứng tốt hơn và phần mềm (Python), chúng ta phải phát minh lại bánh xe:

def line_input (file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line_input(f): 
    # do something with line 

tôi gây ra khi nghĩ rằng một cái gì đó đã đi sai đường ở đâu đó ...

+1

Trong khi, xem xét trăn là lựa chọn tốt nhất của chúng tôi đối với một ngôn ngữ thông dịch, tôi đồng ý với nhận xét này, có thể thuận tiện để thông báo rằng BASIC 16kb với câu WHILE không bao giờ phổ biến. – arivero

3

Bạn làm gì về phương pháp này?

with open(filename) as data: 
    datalines = (line.rstrip('\r\n') for line in data) 
    for line in datalines: 
     ...do something awesome... 

biểu Generator tránh tải toàn bộ tập tin vào bộ nhớ và with đảm bảo đóng file

Các vấn đề liên quan