Как просто пройтись по каталогам и подкаталогам и создать архив, если найдены определенные файлы - PullRequest
0 голосов
/ 13 марта 2020

Я хотел бы создать 2 сценария. Первый будет отвечать за обход всех подкаталогов в родительской папке, поиск файлов с расширением "*.mp4", "*.txt","*.jpg" и, если папка (например, testfolder) с такими тремя файлами найдена, другой сценарий выполняет операцию создания архива testfolder.tar.

Вот мое дерево каталогов для тестирования этих сценариев: https://imgur.com/4cX5t5N

rootDirectory содержит parentDirectory1 и parentDirectory2. parentDirectories содержит childDirectories.

Вот код dirScanner.py, пытающийся напечатать расширения файлов в подкаталогах:

import os

rootdir = r'C:\Users\user\pythonprogram\rootDirectory'
for directory in os.walk(rootdir):
    for subdirectory in directory:
        extensions = []
        if os.path.isfile(os.curdir):
            extensions.append(os.path.splitext(os.curdir)[-1].lower())
        print(extensions)

Однако это абсолютно не работает, как я ожидаю Работа. Как мне пройти через parentDirectories и childDirectiories в rootDirectory?

Я бы хотел, чтобы все было просто: «Хорошо, я в этом каталоге, файлы этого каталога XXX , Должен / Не должен их упаковать "

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

import tarfile

class folderNeededToBePacked:
    def __init__(self, name, path):
        self.path = path
        self.name = name
    def pack(self):
        tar = tarfile.open(r"{0}/{1}.tar".format(self.path, self.name), "w")
        for file in self.path:
            tar.add(file)
        tar.close()

Я был бы благодарен за все советы и подсказки, как достичь цели этой задачи.

1 Ответ

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

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

Идея состоит в том, чтобы пройти по всем каталогам (рекурсивно) и если найден каталог , соответствующий , упакуйте три файла этого каталога в архив.

Чтобы пройти по дереву каталогов, вам необходимо исправить использование os.walk (). согласно документации:

tar = tarfile.open(...)
for dirpath, dirnames, filenames in os.walk(root):
  found_files = dir_matching(root, dirpath)
  for found_file in found_files:
    tar.add(found_file)
tar.close()

И функция dir_matching() должна возвращать список из трех найденных файлов (или пустой список, если каталог не совпадает, т. е. хотя бы один из трех необходимых файлы отсутствуют):

def dir_matching(root, dirpath):
  jpg = glob.glob(os.path.join(root, dirpath, '*.jpg')
  mp4 = glob.glob(os.path.join(root, dirpath, '*.mp4')
  txt = glob.glob(os.path.join(root, dirpath, '*.txt')
  if jpg and mp4 and txt:
    return [ jpg[0], mp4[0], txt[0] ]
  else:
    return []

Конечно, вы можете добавить более сложные проверки, например, точно один jpg et c. найден, но это зависит от ваших конкретных спецификаций.

...