有兩個問題,但都不是com_Letters
。
首先,這段代碼保證line
將永遠是一個空列表:
while 1:
line = file.readlines()
if len(line) == 0:
break
print line
通過循環的第一次,你叫readlines()
,這將
Read until EOF using readline() and return a list containing the lines thus read.
如果該文件是空的,這是一個空的列表,所以你會打破。
否則,您將打印出列表,然後返回循環。在這一點上,readlines()
將沒有剩下可讀的內容,因爲你已經閱讀到EOF,所以它肯定是一個空列表。這意味着你會打破。
無論哪種方式,list
結束爲空。
目前還不清楚你想要用這個循環做什麼。從來沒有任何理由在同一個文件上反覆調用readlines()
。但是,即使存在,您可能也想積累所有結果,而不是隻保留最後一個(保證爲空)的結果。事情是這樣的:
while 1:
new_line = file.readlines()
if len(new_line) == 0:
break
print new_line
line += new_line
無論如何,如果你解決這個問題(例如,由報廢的整個循環,只是使用line = file.readlines()
),你打電話com_Letters
與字符串的一個列表。這不是特別有用;這只是調用set
的一種非常複雜的方式。如果還不清楚爲什麼:
- 由於只有一個參數(字符串列表),所以
*strings
最終成爲該參數的一個元素元組。
map(set, strings)
對單元素元組只調用set
該元素並返回一個單元素列表。
*map(set, strings)
將其分解爲一個參數集。
set.intersection(s)
與s.intersection()
是一樣的,它自己只返回s
。
所有這一切會更容易看到,如果你分手了其中的一些複雜的表達式和print
編的中間值。然後你就會確切知道它首先出錯的地方,而不是僅僅知道它在某個長鏈事件中的某個地方。
一些旁註:
您在file.close
忘了()
,這意味着你沒有真正關閉文件。 with
更好的原因之一是它意味着你不能犯這個錯誤。
對集合使用複數名稱。 line
聽起來像一個變量,它應該有一個單一的行,而不是一個變量,應該有你所有的行。
readlines
沒有sizehint參數的函數基本沒用。如果你只是要遍歷行,你可以做到這一點的文件本身。如果你真的需要列表中的行,而不是懶洋洋地閱讀,list(file)
會讓你的意圖更清晰 - 並且不會誤導你認爲重複執行可能有用。
檢查空集合的Pythonic方法只是if not line:
,而不是if len(line) == 0:
。
while True
比while 1
更清楚。
嘿,'words.txt'裏有什麼?還有,你期望輸出什麼? – msturdy
這個循環應該做什麼? ['readlines()'](http://docs.python.org/2.7/library/stdtypes.html#file.readlines)保證讀取直到EOF。你是否試圖防範不可能的事情,還是有其他原因呢? – abarnert
當我運行這個時,無論文件中有什麼,我實際上'set'對象的'TypeError:描述符'交集'需要一個參數',而不是空的結果。 – abarnert