Как использовать, кроме чисел в моем цикле - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь написать короткий python скрипт. Моя цель проста: код должен предлагать вам выбрать между записью «1» или «2». Если вы выберете 1, вы получите список в консоли, если вы напишете 2, вы получите файл CSV. Кроме того, когда вы пишете что-либо, кроме числа, код просит вас написать еще раз. Итак, все эти функции пока работают хорошо, проблема в том, что когда вы пишете любое другое число, отличное от 1 или 2, скрипт просто завершает свою работу. Что я мог сделать, чтобы включить в число кроме других?

Это сценарий:

while True:
    try:
        answer = int(input("Press 1 to see protein ID in console \nPress 2 to export protein CSV list \nChoose="))
    except ValueError:
        print("Sorry, not what I was expecting \nTry again")
        continue
    else:
        break
if answer== 1:
    from ProteinHtmlID import ProteinHtmlID 

    if __name__ == "__main__":
        protein = ProteinHtmlID("protein.html") #name of the file you want check
        name = protein.getFileName()
        print(name)
    
        count = protein.searchProtein("Acidobacterium ailaaui")
        print(count)
    
        found = protein.findAllProteinNames()
        print(found)
elif answer== 2:
    import pandas as pd
    from ProteinHtmlID import ProteinHtmlID 
    
    #prot_name = ProteinHtmlID("protein.html")
    wp_num = ProteinHtmlID("protein.html")
    
    #found = prot_name.findAllProteinNames()
    found = wp_num.findAllProteinNames()
    
    #prot_name = []
    places = []
    wp_num = []
    
    for elem in found:
      #prot_name.append(elem)
      wp_num.append(elem)
      places.append(found[elem])
      
    
    #data = {'Name' : prot_name, 'Place' : places, 'ID' : wp_num}
    data = {'Place' : places, 'ID' : wp_num}
    dataframe = pd.DataFrame(data)
    df = pd.DataFrame(data)
    df.to_csv('chitin_names.csv', index=False)
    print(dataframe)

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Если пользователь вводит действительное число, отличное от 1 или 2, вы не получите ValueError, поэтому сценарий просто выйдет из while l oop.

Вы можете добавить проверку в блоке try, чтобы этого избежать:

if ans < 1 or ans > 2:
    continue
1 голос
/ 13 июля 2020

Поскольку, кроме проверок на ошибки, вы не можете легко включить тот факт, что answer равно 1 или 2. Вместо этого просто выполните еще одну проверку перед break:

while True:
    try:
        answer = int(input("Press 1 to see protein ID in console \nPress 2 to export protein CSV list \nChoose="))
    except ValueError:
        print("Sorry, not what I was expecting \nTry again")
        continue
    else: # Can't use elif on try...catch if I remember well
        if answer == 1 or answer == 2: # Check answer is 1 or 2. Otherwise, the loop continues
            break

Обратите внимание, что использование continue и else вместе здесь бесполезны.

Кстати, я бы предпочел написать ваш код следующим образом, я считаю его более аккуратным:

while True:
    try:
        answer = int(input("Press 1 to see protein ID in console \nPress 2 to export protein CSV list \nChoose="))
        if answer == 1 or answer == 2:
            break
    except ValueError:
        pass
    print("Sorry, not what I was expecting \nTry again")

Что это делает? чтобы остановить l oop, только если answer равно 1 или 2, и продолжить l oop в противном случае, а затем позже в l oop вы напишете сообщение об ошибке. (except ValueError: pass позволяет продолжить l oop, как если бы ValueError не было).

...