2014-03-30 33 views
1
def get_file(): 
    lst_Filename = [] 
    while True: 
    Filename = input('\nPlease enter name of ballot file: ') 
    try:  
     read_Filename = open(Filename, 'r') 
     txt_Filename = read_Filename.readlines() 
     lst_Filename = [word.strip() for word in txt_Filename] 
     read_Filename.close() 
     return lst_Filename 
    except IOError: 
     print("The file",Filename,"does not exist.") 
     continue 


lst_Filename = get_file() 
lst2 = {} 
for item in lst_Filename: 
    if item.index('1') == 0: 
     print(item) 

lst_Filename的結構爲folllow ['1490 2 Mo','1267 3 Mo','2239 6 Mo','1449 7 Ks'],實際文件包含列表中的數百個項目。ValueError:未找到子字符串,我在做什麼錯?

我試圖選擇以'1'開頭的項目。當我運行該程序,前兩個項目進行打印

1490 2 Mo 

1267 3 Mo 

然後我得到了ValueError異常:字符串沒有找到,它說這個問題是與線「如果item.index(‘1’)== 0 :「,我假設因爲'2239 6 Mo'不以'1'開始

我不明白的是我的代碼對lst_Filename中的每個項目說,如果該項目(這是一個字符串)其0索引中的子串'1'然後選擇該項目。

是不是「如果」一個選擇語句,爲什麼不跳過程序通過不以「1」開頭的項目

感謝

回答

5

問題在於.index()在找不到請求的項目時拋出ValueError。這就是爲什麼它適用於前兩個項目,但是當它到達以1以外的其他項開始的字符串時,它會轉儲錯誤並停止搜索。爲了使你想要做的工作,你應該使用str.startswith()

演示:

>>> lst = ['1490 2 Mo', '1267 3 Mo', '2239 6 Mo', '1449 7 Ks'] 
>>> [item for item in lst if item.startswith('1')] 
['1490 2 Mo', '1267 3 Mo', '1449 7 Ks'] 
1

item.index('1')返回那裏'1'發現在你的列表中的索引。但是,'1'根本不在您的示例列表中。您的問題表明您正在「嘗試選擇以'1'開頭的項目。」從"1"開始,等於"1"不是一回事。您的要求本身可能存在問題,正如您所說的"item,"單數,但實際上列表中的三個項目以"1"開頭。

如果你想找到所有在列表中與"1"開始的項目,你可以用一個列表理解,就像這樣:

[item for item in lst_Filename if item.startswith('1')]