而不是解釋爲什麼你的代碼doe無法工作以及如何解決它(因爲Tim Pietzcker已經做了令人欽佩的工作),我將解釋如何編寫代碼,以便這樣的問題不會出現在第一位。
試圖編寫自己的顯式循環,檢查和索引變量很困難且容易出錯。這就是爲什麼Python給你提供很好的工具,幾乎總是不需要這樣做。這就是爲什麼你在使用Python,而不是C.
例如,看看下面的版本的程序:
count = 10
with open('/Users/abc/testfile.txt', 'r') as testfile:
for i, line in enumerate(testfile):
print line
if (i + 1) % count == 0:
if raw_input('Print More..') not in ['y', 'Y']:
break
這比原來的代碼更短,而且也更有效(不需要閱讀整個文件,然後建立一個巨大的列表),但這些不是很好的理由使用它。
一個很好的理由是它更健壯。這裏有很少的顯式循環邏輯可能導致錯誤。你甚至不需要記住切片是如何工作的(當然,很容易知道它們是[start:stop]
而不是[start:length]
......但是如果你使用另一種語言比Python更頻繁地編程,而且你總是在編寫s.sub(start, length)
,重新會忘記...)。當你到達文件末尾時,它也會自動結束,而不是一直持續下去,爲你關閉文件(即使是在異常情況下,這很痛苦地手動取得),還有其他你還沒有寫的東西。
另一個很好的理由是它更容易閱讀,因爲儘可能地,代碼告訴你它在做什麼,而不是它如何做的細節。
但它仍然不完美,因爲仍然有一件事你可能很容易出錯:那(i + 1) % count == 0
位。事實上,我第一次嘗試時出現了錯誤(我忘了+1,所以它在第0,10,20,......,而不是9,19,29 ......)後給了我一個「更多」提示。如果你有一個grouper
功能,你甚至可以更簡單,魯棒重寫它:
with open('/Users/abc/testfile.txt', 'r') as testfile:
for group in grouper(testfile, 10):
for line in group:
print line
if raw_input('Print More..') not in ['y', 'Y']:
break
,或者甚至更好:
with open('/Users/abc/testfile.txt', 'r') as testfile:
for group in grouper(testfile, 10):
print '\n'.join(group)
if raw_input('Print More..') not in ['y', 'Y']:
break
不幸的是,有內置,說沒有這樣的石斑魚功能,itertools
模塊,但你可以寫一個很容易:
def grouper(iterator, size):
return itertools.izip(*[iterator]*size)
(如效率問題,解決這個搜索網站,也有人們在-部門做了幾個問題h比較不同的方式來達到同樣的效果。但通常沒關係。對於這個問題,如果你想了解爲什麼這個羣組的東西,搜索這個網站,因爲它已被解釋至少兩次。)
一個方面的注意事項:即使你解決這個問題,程序將永遠循環一次你到達最後。如果文件長度爲100行,則「行[100:110]」,「行[110:120]」等都是完全有效的空列表。你可能想'爲了在f:'而不是寫你自己的顯式循環和計數器。另外,爲什麼導入你不需要的模塊,爲什麼要分配'block'兩次? – abarnert