【问题标题】:ValueError: substring not found, What am I doing wrong?ValueError:找不到子字符串,我做错了什么?
【发布时间】:2020-12-23 08:54:02
【问题描述】:
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'],实际文件包含列表中的数百个项目。

我正在尝试选择以“1”开头的项目。当我运行程序时,会打印前两项

1490 2 Mo

1267 3 Mo

然后我得到 ValueError: substring not found,它说问题出在“if item.index('1') == 0:”行上,我假设因为 '2239 6 Mo' 不以 ' 开头1'

我不明白的是,我的代码对 lst_Filename 中的每个项目都表示,如果该项目(这是一个字符串)在其 0 索引中具有子字符串“1”,则选择该项目。

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

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

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

    【讨论】:

    • item.find('1') 如果字符串中不存在 '1',同样会失败
    • 它将返回-1,但不会引发任何异常。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        显然,这可以解决问题:

        phrase = "A man, a plan, a canal, Panama!"
        portion = "Panama"
        
        if portion.lower() in phrase.lower():
            # ...
        else:
            # ...
        

        【讨论】:

          猜你喜欢
          • 2014-11-06
          • 2017-09-29
          • 2018-10-09
          • 2021-11-28
          • 2011-05-08
          • 1970-01-01
          • 2017-05-10
          • 2013-10-09
          • 1970-01-01
          相关资源
          最近更新 更多