Цикл удаления файлов из папки, в которой есть какой-то специальный текст - PullRequest
0 голосов
/ 31 января 2019

У меня есть папка со многими TXT-файлами.Я хочу удалить из этой папки файлы со словами «С наилучшими пожеланиями».Я написал простой цикл, но у меня все еще есть проблема I/O operation on closed file.

Вот мой код.

import os, os.path
path = 'H:/UsersData/...'

for f in os.listdir(path):
    with open(os.path.join(path, f), encoding = 'utf-8') as input_data:
        for line in input_data:
            if 'Best Regards' in line:
                input_data.close()
                os.remove(os.path.join(path, f))

Ответы [ 3 ]

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

Вам нужно разорвать цикл for, когда вы найдете строку, содержащую «С наилучшими пожеланиями».Поскольку вы используете менеджер контекста, нет необходимости явно закрывать файл.Файл будет закрыт при выходе из диспетчера контекста.Затем вы можете удалить файл

import os, os.path
path = 'H:/UsersData/...'

for f in os.listdir(path):
    delete_file = False
    with open(os.path.join(path, f), encoding = 'utf-8') as input_data:
        for line in input_data:
            if 'Best Regards' in line:
                delete_file = True
                break
     if delete_file:
         os.remove(os.path.join(path, f))
0 голосов
/ 31 января 2019

Привыкайте к использованию pathlib.Также вы хотите убедиться, что хотите удалить файлы, вы делаете это, создавая список файлов, которые вы хотите удалить вначале (просматривая их, чтобы убедиться в правильности логики оператора), а затем упорядочивая их. Документация

from pathlib import Path

path = Path('H:/UsersData/...')
files_to_delete = [f for f in path.iterdir() if f.is_file() and 'Best Regards' in f.read_text()]
for f in files_to_delete:
    f.unlink()
0 голосов
/ 31 января 2019

Вы можете использовать флажок.

EX:

import os, os.path
path = 'H:/UsersData/...'

deleteFile = False
for f in os.listdir(path):
    with open(os.path.join(path, f), encoding = 'utf-8') as input_data:
        for line in input_data:
            if 'Best Regards' in line:
                deleteFile = True
                break
    if deleteFile:
        os.remove(os.path.join(path, f))
        deleteFile = False
...