2013-06-07 46 views
5

Tôi có một tập tin "test.txt":là đối tượng tập tin trong python một iterable

this is 1st line 
this is 2nd line 
this is 3rd line 

đoạn mã sau

lines = open("test.txt", 'r') 
for line in lines: 
    print "loop 1:"+line 
for line in lines: 
    print "loop 2:"+line 

chỉ in:

loop 1:this is 1st line 

loop 1:this is 2nd line 

loop 1:this is 3rd line 

Nó doesn' t in loop2 ở tất cả.

Hai câu hỏi:

  1. đối tượng tập tin được trả về bởi open(), nó là một iterable? đó là lý do tại sao nó có thể được sử dụng trong một vòng lặp for?

  2. lý do tại sao loop2 không được in ở tất cả?

Trả lời

24

Nó không chỉ là có thể lặp lại, đây là một máy phát lặp , đó là lý do tại sao nó chỉ có thể duyệt qua tệp một lần. Bạn có thể đặt lại con trỏ tệp bằng .seek(0) như nhiều người đã đề xuất nhưng bạn nên, trong hầu hết các trường hợp, chỉ lặp lại một tệp một lần.

+1

+1 cho một mô tả ngắn gọn, súc tích về điều lặp có thể lặp lại (hầu hết các câu trả lời khác thậm chí không cố gắng, mặc dù đó là chìa khóa cho câu hỏi). – abarnert

+0

Cảm ơn mô tả đó. – martinbshp

1

Bạn đã ở cuối tệp. Các đối tượng tệp là các trình vòng lặp. Một khi bạn lặp lại chúng, bạn đang ở vị trí cuối cùng. Lặp lại lần nữa sẽ không bắt đầu ngay từ đầu. Nếu bạn muốn bắt đầu lại một lần nữa, bạn cần sử dụng lines.seek(0).

+0

Điều này gây hiểu lầm. 'list's cũng có thể lặp lại, và bạn có thể lặp lại chúng một lần nữa mà không có' tìm kiếm' hoặc tương đương. Vấn đề là các đối tượng tập tin là _iterators_ (cũng như là iterables). – abarnert

+0

Typo. Tôi có nghĩa là iterator. Cảm ơn. Đã sửa. –

2

Có, đối tượng tệp là trình lặp.

Giống như tất cả các trình vòng lặp, bạn chỉ có thể lặp qua chúng sau khi, sau đó trình vòng lặp cạn kiệt. Con trỏ đọc tệp của bạn nằm ở cuối tệp. Mở lại tệp hoặc sử dụng .seek(0) để tua lại con trỏ tệp nếu bạn cần lặp lại.

Cách khác, cố gắng tránh lặp vòng lặp lại tệp hai lần; trích xuất những gì bạn cần vào một datastructure khác (danh sách, từ điển, tập hợp, đống, vv) trong vòng lặp đầu tiên.

2

Có, đối tượng tệp có thể lặp lại nhưng để quay lại đầu tệp bạn cần sử dụng lines.seek(0), vì sau vòng lặp đầu tiên bạn đang ở cuối tệp.

0

Sẽ tốt hơn, tuy nhiên, để viết lại mã để tệp không cần lặp lại hai lần. Đọc tất cả các dòng vào danh sách một số loại hoặc thực hiện tất cả quá trình xử lý trong một vòng lặp đơn.

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