Скрипт Python для удаления всех txt-файлов, соответствующих условию, из подкаталогов, не влияя на структуру каталогов

#python #python-3.x #text-processing

Вопрос:

Я пытаюсь написать скрипт на python, который удаляет текстовые файлы, в которых меньше слов «wordLimit», где «wordLimit» — заданное число. Файлы должны быть удалены из всех каталогов и подкаталогов по определенному пути. Структура каталогов должна оставаться прежней.

Моя версия всегда выводит «Ошибка при удалении файла».

 import os, glob
wordLimit = 1000
directory = os.getcwd()

def shouldArticleBeRemoved(filepath, minWords):
    number = 0
    filename = os.path.basename(filepath)
    with open(filename, 'r ') as f:
        for line in f:
            words = line.split()
            number  = len(words)
    if number < minWords:
        return True
    else: return False

def iterateCheckAndRemove():
    notRemoved = 0
    removed = 0
    fileList = glob.glob('C:/Users/HP/Desktop/Articles/*/*/*.txt', recursive=True)
    for filePath in fileList:
        try:
            if shouldArticleBeRemoved(filePath, wordLimit):
                os.remove(filePath)
                removed  = 1
            else: notRemoved  =1
        except OSError:
            notRemoved  =1
            print("Error while deleting file")
    print(removed)

iterateCheckAndRemove()
 

Комментарии:

1. можете ли вы вставить полную ошибку? Просто выведите ошибку except OSError as e , а затем pint(e)

2. Приведенная ниже ошибка повторяется для всех статей. [Ошибка 2] Такого файла или каталога нет: ‘Article.txt» Файлы существуют по этому пути.

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

Ответ №1:

Попробуй это. Все гораздо проще:-

 import os

def main():
    wordLimit = 1000
    for r, _, f in os.walk(r'C:UsersHPDesktopArticles'):
        for _f in f:
            apath = os.path.join(r, _f)
            _, ext = os.path.splitext(apath)
            if ext == '.txt':
                try:
                    rflag = False
                    with open(apath) as text:
                        if len(text.read().split()) < wordLimit:
                            rflag = True
                    if rflag:
                         os.remove(apath)
                         print(f'{apath} was deleted')
                except Exception as e:
                    print(f'Error while processing {apath} -> {e}')

        
if __name__ == '__main__':
    main()
 

Комментарии:

1. Спасибо! Ваш скрипт видит все файлы, но он всегда возвращает [WinError 32] Процесс не может получить доступ к файлу, потому что он используется другим процессом. Я попытался завершить все процессы, связанные с python, из диспетчера задач, но все осталось по-прежнему.

2. Этот код работает на macOS (Unix), потому что можно удалить файл, пока он открыт (удаление произойдет, как только он будет закрыт). Я внесу небольшое изменение в код, который будет продолжать работать в системах типа Unix, но может помочь в Windows. Если это не сработает, то у вас должно быть запущено что-то, что открывает эти файлы.

3. Это прекрасно работает с этим изменением. Спасибо!