ValueError:找不到子字符串,我做错了什么?

时间:2014-03-30 17:13:55

标签: python-3.x

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的结构如下[' 1490 2 Mo',' 1267 3 Mo',' 2239 6 Mo',' 1449 7 Ks& #39;],实际文件包含列表中的数百个项目。

我试图选择以' 1'开头的项目。当我运行程序时,前两个项目被打印

1490 2 Mo

1267 3 Mo

然后我得到了ValueError:substring not found,它表示问题在于"如果item.index(' 1')== 0:",我假设因为' 2239 6 Mo'不以' 1'

开头

我不明白的是,我的代码会对lst_Filename中的每个项目说明,如果该项目(字符串)具有子字符串' 1'在其0索引中然后选择项目。

不是'如果'选择声明,为什么程序不会跳过不以#1;'

开头的项目

谢谢

4 个答案:

答案 0 :(得分:10)

item.index(' 1')正在提出异常,因为' 1'在字符串(https://docs.python.org/2/library/string.html#string.index)中找不到。尝试使用item.find(' 1')代替!

答案 1 :(得分:8)

问题是.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']

答案 2 :(得分:1)

item.index('1')会返回列表中找到'1'的索引。但是,'1'根本不在您的示例列表中。您的问题表明您已尝试选择以'1'开头的项目。"以"1"开头,等于"1"不是一回事。您的要求本身可能存在问题,正如您所说的"item,"单数,但实际上您的列表中的三个项目都以"1"开头。

如果要查找列表中以"1"开头的所有项目,可以使用列表推导,如下所示:

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

答案 3 :(得分:0)

显然,这可以解决问题:

phrase = "A man, a plan, a canal, Panama!"
portion = "Panama"

if portion.lower() in phrase.lower():
    # ...
else:
    # ...