написать в лог-файл, если правила не выполняются - PullRequest
0 голосов
/ 09 апреля 2020

В настоящее время я пишу код для сканирования файлов во входной папке и копирования изображений, которые соответствуют требованиям (список «правил»), в другой каталог. Если файл не выполняет sh какого-либо заданного требования, об этом следует сообщить в logfile.txt, указав что-то вроде:

Error number 1, file -> data\0055\0100.jpg

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

Error number 1, file -> data\0055\0100.jpg
Error number 2, file -> data\0055\0100.jpg
Error number 3, file -> data\0055\0100.jpg

Итак, как мне записать каждую запись в лог-файл с отдельным номером «правила» без повторений? Кроме того, как мне проверить, существует ли уже скопированный файл в output_dir?

Мой текущий код:

import os
from glob import glob
from PIL import Image
import shutil
from tqdm import tqdm

input_dir = 'data'
output_dir = 'out'

try:
    if os._exists(output_dir) == False:
        os.mkdir(output_dir)
except FileExistsError:
    print('Directory "out" already exists! Proceeding with script')

logfile = open('logfile.txt','w+')

ext = ('jpg', 'jpeg', 'JPG', '.PEG')

dirs = sorted(glob(os.path.join(input_dir, '**/*.jpg'),
                               recursive=True))

def checker(input_dir, output_dir, logfile):
    for i, file in tqdm(enumerate(input_dir), desc='Processing copied files!',
                              total=len(input_dir)):
        rules = [file.endswith(ext),
                 os.path.getsize(file) >= 10000,
                 Image.open(file),

                     ]

        if all(rules):
            # shutil.copy(file, output_dir)
                new_filename = str(i).zfill(6) + '.jpg'
                shutil.copy(file, os.path.join(output_dir, new_filename))
        else:
            for i, rule in enumerate(rules):
                logfile.write(f'\nError number {i+1}, file -> {file}\n')

checker(dirs, output_dir, logfile)

Спасибо за внимание, если вы читаете это!

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Я нашел решение: перед записью в файл журнала я составил еще один список, в котором каждый раз записывается индекс невыполненного правила, а затем выводится в файл журнала. Это выглядит так:

        else:
            errors = [num for (num, state) in enumerate(rules) if not state]
            for num in errors:
                logfile.write(f'{file};{num+1}\n')  

Но у меня остается один вопрос: как проверить, открывает ли расширение PIL файл без ошибки?

0 голосов
/ 09 апреля 2020

Вы были на правильном пути, открыв файл. Просто выполните Image.open () с помощью «try: / catch:». Из PIL Do c страниц :

PIL.Image.open(fp, mode='r')
...
Raises: 
IOError – If the file cannot be found, or the image cannot be opened and identified.
...
0 голосов
/ 09 апреля 2020

вызов Image.open (file) в вашем коде не возвращает True / False, он возвращает объект файла. Таким образом, вы не будете тестировать (True / False, True / False, True / False), поэтому тест all () всегда будет возвращать «fail».

Вам нужно переделать последний тест в твои правила, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...