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

use*_*234 8 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)
Run Code Online (Sandbox Code Playgroud)

lst_Filename的结构如下['1490 2 Mo','1267 3 Mo','2239 6 Mo','1449 7 Ks',实际文件包含列表中的数百个项目.

我正在尝试选择以"1"开头的项目.当我运行程序时,前两个项目被打印

1490 2 Mo

1267 3 Mo
Run Code Online (Sandbox Code Playgroud)

然后我得到ValueError:substring not found,它说问题是"如果item.index('1')== 0:",我假设因为'2239 6 Mo'不以'1'开头

我不明白的是我的代码对lst_Filename中的每个项都说,如果该项(它是一个字符串)在其0索引中有子字符串'1',那么选择该项.

不是'if'选择语句,为什么程序不会跳过不以'1'开头的项目

谢谢

Tam*_*mas 16

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

  • 它将返回-1,但不会引发任何异常. (12认同)

Ale*_*ton 9

这个问题是当它找不到请求的项目时.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']
Run Code Online (Sandbox Code Playgroud)