1. ホーム
  2. python-3.x

[解決済み] ValueError: Substring not found, What am I doing wrong?

2022-02-04 03:54:13

質問

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'で始まる項目を選択しようとしています。プログラムを実行すると、最初の2つの項目が出力されます。

1490 2 Mo

1267 3 Mo

問題は "if item.index('1') == 0:" という行にあるそうで、'2239 6 Mo' が '1' で始まらないからだと思われます。

私が理解していないのは、私のコードは、lst_Filenameの各項目について、その項目(文字列である)の0インデックスに部分文字列「1」がある場合、その項目を選択する、というものです。

if'は選択文ではないのですか、なぜプログラムは'1'で始まらない項目をスキップしないのですか。

解決方法は?

この場合の問題点は .index() 投げる ValueError は、要求された項目が見つからなかったときに このため、最初の2つの項目についてはうまくいきますが、それ以外の何かで始まる文字列に到達すると 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']