Невозможно проверить значение в текущей итерации цикла for при использовании любого в Python 2.7.5 - PullRequest
0 голосов
/ 08 июля 2019

, поэтому в настоящее время я пытаюсь увидеть, существует ли файл с использованием Python 2.7.5 с ключевым словом any и соответствует ли он одному из возможных вариантов в моем списке возможных имен файлов, чтобы распечатать его. Если ни один из них не существует, он должен просто распечатать ошибку.

Итак, для этого у меня есть следующий код:

import os
import sys

# globals
base_dir = 'C:\\Users\\Rietty\\'

def main():
        # Get a list of all directories. 
        directories = [dI for dI in os.listdir(base_dir) if os.path.isdir(os.path.join(base_dir, dI))]
        # Check if global.xml exists.
        # Check #1 
        for dir in directories:
                filenames = ["global.xml", "globals.xml"]
                this_file = dir + "-base.xml"
                filenames.append(this_file)
                if not os.path.isdir(os.path.join(base_dir, dir)): 
                        continue
                if not any(os.path.isfile(os.path.join(base_dir, dir, filename)) for filename in filenames):
                        print("Error" + ": No global(s).xml or *-base.xml file in " + dir + "!")
                else:
                        print(filename) # Errors out here!!

if __name__== "__main__":
    main()

И я получаю ошибку:

    print(filename)
NameError: global name 'filename' is not defined

Это работает правильно, если я уберу оператор else, но затем выполню только половину работы, которая проверяет, не существуют ли файлы. Я хочу знать, существуют ли они (их может быть больше одного), и добавить их в список / скажите, какие из трех файлов существуют.

Как я могу изменить свой код для достижения этой цели?

1 Ответ

1 голос
/ 08 июля 2019

filename не является локальным в вашей функции. Это только локальное выражение в выражении генератора в тесте any(), но выражения генератора выполняются как будто в отдельной функции. Это относится ко всем именам, связанным с выражением генератора.

Не используйте any() здесь. Вы хотите просмотреть свой список filenames, проверить каждый из них и выйти из цикла, когда найдете совпадение. Если вы не нашли соответствия, используйте ветку else: цикла for , чтобы напечатать ошибку. Ветвь else: цикла выполняется, когда цикл никогда не достигает оператора break:

    for dir in directories:
        filenames = ["global.xml", "globals.xml", dir + "-base.xml"]
        for filename in filenames:
            filepath = os.path.join(base_name, dir, filename)
            if os.path.isfile(filepath):
                print(filepath)
                break
        else:
            # only reached if no `break` statement was reached
            print("Error: No global(s).xml or *-base.xml file in {}!".format(dir))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...