Glob для печати списка отсутствующих файлов - PullRequest
0 голосов
/ 20 марта 2020

Чего мне здесь не хватает?

Я пытаюсь напечатать список отсутствующих файлов, например, я использую «WorhSheet_X» и «WorkSheet_Y» в качестве ожидаемых файлов, я хочу иметь возможность распечатать имена файлов, которые отсутствуют, если в папке отсутствуют файлы.

Иначе, просто я пытаюсь создать код, который автоматически отправляет электронное письмо, когда отсутствуют файлы, с в теле письма отсутствуют имена файлов.

import glob

dir_to_search = r'G:\folder'

files_in_dir = glob.glob("{}{}".format(dir_to_search,'*.xls?'))

list_of_files = glob.glob('WorkSheet_X*','WorkSheet_Y*', recursive=True)

missing_files = [x for x in list_of_files if x not in files_in_dir]

print(missing_files)

Получена ошибка:

Traceback (most recent call last): ...
list_of_files = glob.glob('WorkSheet_X*','WorkSheet_Y*', recursive=True)
TypeError: glob() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given

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

Мне нужно выполнить поиск файлов с частичным назовите «WorkSheet_X *», потому что каждый день в «WorkSheet_X» стоит другая дата после «X».

1 Ответ

1 голос
/ 20 марта 2020

Вы сравниваете полные пути к файлам, которые существуют в разных каталогах, потому что, поскольку ваш код теперь стоит, вы выполняете поиск шаблонов WorkSheet_X * и WorkSheet_Y * в текущем рабочем каталоге, который будет отличаться от dir_to_search ( если это не так, я не уверен, в чем смысл этой программы). В любом случае, этот код позволяет текущему рабочему каталогу быть каким-то другим каталогом, кроме dir_to_search. Таким образом, этот код разделяет полные пути файлов и просто сравнивает имена файлов, а также пытается внести некоторые оптимизации (и исправления в ваш код):

import glob, itertools, os.path

dir_to_search = r'G:\folder'

# Create a set from the list of files to make searching more efficient but use only filename:
files_in_dir = {os.path.split(f)[1] for f in glob.iglob(os.path.join(dir_to_search, '*.xls?'))}
"""
Use itertools.chain to combine calls to rglob.
So rather than building an in-memory list, we are building a generator that
will return the filenames as we need them. This is more efficient if there are a lot of files.
"""
list_of_files = itertools.chain(glob.glob('WorkSheet_X*'), glob.glob('WorkSheet_Y*'))
# but we now must separate the file name from the full path sepcification:
missing_files = [f for f in list_of_files if os.path.split(f)[1] not in files_in_dir]

print(missing_files)

Если мы говорим о действительно большом количестве файлы, составляющие шаблон '*.xls?' в каталоге dir_to_search, может быть лучше , а не вообще создать набор files_in_dir и вместо этого искать каталог для каждого файла-кандидата:

missing_files = [f for f in list_of_files if not os.path.isfile(os.path.join(dir_to_search, os.path.split(f)[1]))]

Однако есть небольшая разница. Предположим, мы нашли файл с именем WorkSheet_X1.csv, и он существует в каталоге dir_to_search. Первый метод покажет его как отсутствующий, потому что он не соответствует шаблону *.xls?. Однако он не будет указан как отсутствующий при использовании второго метода, поскольку он существует в правильном каталоге. Должен ли используемый шаблон глобуса действительно быть 'WorkSheet_X*.xls?'?

...