首页 > 解决方案 > 如果不满足规则,则写入日志文件

问题描述

我目前正在编写代码来扫描输入文件夹中的文件并将满足要求(“规则”列表)的图像复制到另一个目录。如果文件没有满足任何给定的要求,则应将其报告给 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)

如果您正在阅读本文,敬请关注!

标签: pythonfile-io

解决方案


代码中的 Image.open(file) 调用不返回 True/False,它返回一个文件对象。因此,您不会进行测试(真/假、真/假、真/假),因此 all() 测试将始终返回“失败”。

我认为,您需要修改规则中的最后一个测试。


推荐阅读