Есть ли лучший способ удалить все файлы .py и .pyc в данном подкаталоге? - PullRequest
0 голосов
/ 28 января 2019

Я написал скрипт для удаления всех файлов .py и .pyc в заданном подкаталоге, который называется «миграция».Конечной целью является удаление всех файлов миграции из моего проекта django, поэтому есть несколько подпапок, называемых «миграциями», и я хотел бы удалить все .py и .pyc (кроме init .py) изэти папки.Сценарий, который я написал ниже, работает, но я новичок в python и считаю, что должен быть лучший способ, чем все вложенные циклы.Какие-либо предложения?Это система Windows, которая усложняет мне жизнь.

import os
import sys

def delete_py(path, subfolder):
    try:
        if os.path.exists(path):
            for (root, dirs, files) in os.walk(path):
                for dir in dirs:
                    if dir == subfolder:
                        goto = os.path.join(root, dir)
                        for (root, dirs, files) in os.walk(goto):
                            for file in files:
                                if (file.lower().endswith('.py') | 
                                    file.lower().endswith('.pyc')) and 
                                    file != '__init__.py':
                                    print('file: ', file)
                                    # will change to os.remove once finsihed
    except:
        print('Unable to delete files')


if __name__ == "__main__":
    current = os.getcwd()
    delete_py(current, 'migrations')

Ответы [ 2 ]

0 голосов
/ 28 января 2019

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

Все, что вам нужно проверить, это если migrations является элементом втекущий root путь к обрабатываемому каталогу:

def delete_py(path, subfolder):
    for root, dirs, files in os.walk(path):
        if subfolder in root.split(os.sep):
            # has subfolder as a directory name in the path, delete .py files here
            for file in files:
                if file == '__init__.py':
                    continue
                if file.endswith(('.py', '.pyc')):
                    os.unlink(os.path.join(root, file))

Вы также можете просто использовать рекурсивный шаблон glob с модулем glob :

from itertools import chain

def delete_py(path, subfolder):
    pyfiles = glob.iglob(f'**/{subfolder}/**/*.py', recursive=True)
    pycfiles = glob.iglob(f'**/{subfolder}/**/*.pyc', recursive=True)
    for filename in chain(pyfiles, pycfiles):
        if os.path.basename(filename) == '__init__.py':
            continue
        os.unlink(filename)
0 голосов
/ 28 января 2019

Один os.walk должен сделать большую часть работы за вас;Единственный другой цикл, который вам нужен, - это пройти по files в каждом каталоге, в который вы попадете.Вам, конечно, не нужно вложенное os.walk.

...