В Python как мне создать список файлов на основе указанных расширений файлов? - PullRequest
0 голосов
/ 17 февраля 2020

Допустим, у меня есть папка с кучей файлов (с разными расширениями). Я хочу создать список файлов из этой папки. Однако я хочу создать список файлов с расширениями файлов SPECIFI C.

Эти расширения файлов разбиты на группы.

Расширения файлов: .jpg, .png, .gif, .pdf, .raw, .docx, .pptx, .xlsx,. js,. html,. css

Группа «image» содержит .jpg, .png, .gif. Группа "Adobe" содержит .pdf, .raw. (да, я перечисляю «.raw» в качестве файла Adobe для этого примера: P) Группа «Microsoft» содержит .docx, .pptx, .xlsx. Группа "webdev" содержит. js,. html,. css.

Я хочу иметь возможность добавлять эти типы файлов в список. Этот список будет создан в файле ".txt" и будет содержать ВСЕ файлы с выбранными расширениями.

Так что, если в моей папке 5 файлов изображений, 10 файлов Adobe, 5 файлов Microsoft, 3 файла Webdev и Я выбираю группы "image" и "microsoft", это приложение в Python создаст файл .txt, содержащий список имен файлов с расширениями, принадлежащими только к группам изображений и microsoft.

текстовый файл будет иметь такой список: * На данный момент мой код создает текстовый файл, который генерирует список ВСЕХ файлов в указанной папке. Я мог бы использовать оператор «if», чтобы получить конкретное расширение файла c, но я не думаю, что это достигает желаемых результатов. В этом случае мне нужно было бы создать функцию для каждой группы (т.е. функцию для групп изображений, Adobe, Microsoft и Webdev). Я хочу иметь возможность свободно объединять эти группы (например, файлы изображений и файлы Microsoft в списке).

Пример выражения if:

for elem in os.listdir(filepath):
    if elem.endswith('.jpg'):
        listItem = elem + '\n'
        listName = filepath + (r"\{}List.txt".format(name))
        writeFile = open(listName, 'a')
        writeFile.write(listItem)
        writeFile.close()
    if elem.endswith('.png'):
        listItem = elem + '\n'
        listName = filepath + (r"\{}List.txt".format(name))
        writeFile = open(listName, 'a')
        writeFile.write(listItem)
        writeFile.close()
    if elem.endswith('.gif'):
        listItem = elem + '\n'
        listName = filepath + (r"\{}List.txt".format(name))
        writeFile = open(listName, 'a')
        writeFile.write(listItem)
        writeFile.close()
    else:
        continue

Полный код без слова if «оператор (создает файл .txt со всеми именами файлов из указанной папки):

import os

def enterFilePath():
    global filepath
    filepath = input("Please enter your file path. ")
    os.chdir(filepath)

enterFilePath()

def enterFileName():
    global name
    global listName
    name = str(input("Name the txt file. "))
    listName = name + ".txt"

enterFileName()

def listGenerator():
    for filename in os.listdir(filepath):
        listItem = filename + ' \n'
        listName = filepath + (r"\{}List.txt".format(name))
        writeFile = open(listName, 'a')
        writeFile.write(listItem)
        writeFile.close()

listGenerator()

1 Ответ

1 голос
/ 17 февраля 2020

Указатель, прежде чем попасть в ответ - избегайте использования 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 или аргументы скрипта, а также обработку случаев, когда запрашиваемая группа не существует в словаре групп. Приведенный выше код, вероятно, также будет более полезен в качестве функции, но я оставлю эту реализацию на ваше усмотрение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...