Зацикливание блока Try/Except до тех пор, пока файл не будет прочитан

avatar
Nick Nasty
8 апреля 2018 в 06:19
76
3
0

У меня есть блок try/except в функции, которая просит пользователя ввести имя открываемого текстового файла. Если файл не существует, я хочу, чтобы программа снова запрашивала у пользователя имя файла либо до тех пор, пока он не будет найден, либо пока пользователь не нажмет ENTER.

Сейчас блок try/except работает бесконечно.

def getFiles(cryptSelection):
    # Function Variable Definitions
    inputFile = input("\nEnter the file to " + cryptSelection +\
                      ". Press Enter alone to abort: ")
    while True:
        if inputFile != '':
            try:
                fileText = open(inputFile, "r")
                fileText.close()
            except IOError:
                print("Error - that file does not exist. Try again.")
        elif inputFile == '':
            input("\nRun complete. Press the Enter key to exit.")
        else:
            print("\nError - Invalid option. Please select again.")   
    return inputFile
Источник
Burhan Khalid
8 апреля 2018 в 06:23
0

Попробуйте проверить длину обрезанного ввода вместо ''

timgeb
8 апреля 2018 в 06:23
0

Да, циклы while True работают вечно, если вы их не сломаете, в этом и есть смысл.

Bentaye
8 апреля 2018 в 06:24
0

вам нужно выйти из цикла while после чтения файла.

Ответы (3)

avatar
Bentaye
8 апреля 2018 в 06:28
0

Вам нужно выйти из цикла while, это нужно сделать в 2-х местах:

  • После чтения файла (если это правильный файл)
  • После нажатия клавиши Enter. потому что мы хотим закончить.

Кроме того, вам нужно задать вопрос внутри цикла, чтобы вопрос задавался снова при каждой итерации, а значение inputFile обновлялось в соответствии с последним вводом пользователя

И последнее, я думаю, что ваше предложение else может быть удалено, так как к нему никогда не обращаются, if и elif охватывают все возможности (т. е. inputFile имеет значение или нет).

def getFiles(cryptSelection):
    while True:
        inputFile = input("\nEnter the file to %s. Press Enter alone to abort:" % cryptSelection)

        if inputFile != '':
            try:
                fileText = open(inputFile, "r")
                fileText.close()
                # break out of the loop as we have a correct file 
                break
            except IOError:
                print("Error - that file does not exist. Try again.")

        else:  # This is the Enter key pressed event
            break

    return inputFile
avatar
AntiMatterDynamite
8 апреля 2018 в 06:42
0

у вас есть while True, но нет break в вашем коде, который вы, вероятно, хотите сломать после fileText.close() следующим образом:

try:
    fileText = open(inputFile, "r")
    fileText.close()
    break
except IOError:
    print("Error - that file does not exist. Try again.")

но на самом деле вы должны изменить эту проверку, чтобы использовать os.path.isfile следующим образом:

import os

def getFiles(cryptSelection):
    inputFile = input("\nEnter the file to " + cryptSelection +\
                  ". Press Enter alone to abort: ")
    while True:
        if inputFile != '':
            if os.path.isfile(inputFile):
                return inputFile
            else:
                print("Error - that file does not exist. Try again.")
        elif inputFile == '':
            input("\nRun complete. Press the Enter key to exit.")
        else:
            print("\nError - Invalid option. Please select again.")   
NirMH
11 июля 2019 в 11:55
0

Был ли мой ответ полезен? если да, пожалуйста, подтвердите это

avatar
NirMH
8 апреля 2018 в 06:24
-2

Это потому, что вы не присваиваете новое значение inputFile в цикле while. Оно навсегда сохранит одно и то же значение...

РЕДАКТИРОВАТЬ

После того, как вы присвоите новое значение inputFile в цикле, обязательно прервите его при выполнении условия выхода ("пользователь нажимает Enter9")<13117070>9) >