#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. Это прекрасно работает с этим изменением. Спасибо!