Указатель, прежде чем попасть в ответ - избегайте использования global
в пользу параметров функции и return
значений. Это значительно облегчит отладку головной боли и упростит отслеживание потока данных в вашей программе.
нострадамус прав в своем комментарии, dict
будет идеальным способом решения вашей проблемы здесь. Я также делал подобные вещи, как ваша проблема, прежде чем использовать itertools.chain.from_iterable
и pathlib.Path
, которые я буду использовать здесь.
Во-первых, дикт :
groups = {
'image': {'jpg', 'png', 'gif'},
'adobe': {'pdf', 'raw'},
'microsoft': {'docx', 'pptx', 'xlsx'},
'webdev': {'js', 'html', 'css'}
}
Это устанавливает группы расширений, которые вы упомянули, к которым вы можете легко получить доступ с помощью groups['image']
, groups['adobe']
, et c.
Затем, используя Path.glob
метод, itertools.chain.from_iterable
, и понимание, вы можете получить список желаемых файлов в одном выражении (или функции).
# Set up some variables
target_groups = ['adobe', 'webdev']
# Initialize generator
files = chain.from_iterable(
# Glob pattern for the current extension
Path(filepath).glob(f'*.{ext}')
# Each group in target_groups
for group in target_groups
# Each extension in current group
for ext in groups[group]
)
# Then, just iterate the files
for fpath in files:
# Do stuff with file here
print(fpath.name)
В моем тестовом каталоге есть один файл каждого расширения, которое вы перечислили , названные a
, b
, et c для каждой группы. Используя приведенный выше код, я получаю:
a.pdf
b.raw
a.js
b.html
c.css
Настройка списка файлов / генератора означает, что список файлов будет отсортирован по группе расширений, затем по расширению, а затем по имени. , Если вы хотите изменить группы, перечисленные в списке, просто добавьте / удалите значения в списке target_groups
выше (также работает с одним параметром).
Вы также можете рассмотреть возможность параметризации своих целей, например, через input
или аргументы скрипта, а также обработку случаев, когда запрашиваемая группа не существует в словаре групп. Приведенный выше код, вероятно, также будет более полезен в качестве функции, но я оставлю эту реализацию на ваше усмотрение:)