Please enable Javascript to view the contents

Python 删除小文件

 ·  ☕ 2 分钟

在 windows 下,删除特定大小的文件是非常简单的,一个简单的 powershell 脚本命令就可以搞定。

比如删除小于6KB的 png 格式的文件:

1
ls -Filter *.png | where {$_.Length -lt 6KB} | Remove-Item -Force-Recurse 

我最近用 Stable Diffusion AI 画图工具画了一些图。有一些图是纯黑的失败作品。因为纯色图片相对是比较小的,就可以用上面的脚本删除掉。

AI失败图片

但是,因为我在AI画图的时候,会把每一步的图的标签也存下来,所以每一个 png 文件,都会有一个对应的 txt 文件,也是要删除的。所以,我就写了一个 python 脚本,删除指定大小的文件,和相关的 txt 文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os
import argparse

def get_all_files(path,ext,size):
    all_files = []
    for root, _dirs, files in os.walk(path):
        for filename in files:
            if ext is None or filename.endswith(ext):
                file_path = os.path.join(root, filename)
                if os.path.getsize(file_path) < size:
                    all_files.append(file_path)
    return all_files

def remove(all_files):
    for filename in all_files:
        info_file = os.path.splitext(filename)[0] + '.txt'
        os.remove(filename)
        if os.path.exists(info_file):
            os.remove(info_file)

def show_filesize(file_path):
    size = os.path.getsize(file_path)
    if size < 1024:
        return str(size) + 'B'
    elif size < 1024 * 1024:
        return str(round(size / 1024, 2)) + 'KB'
    elif size < 1024 * 1024 * 1024:
        return str(round(size / 1024 / 1024, 2)) + 'MB'
    else:
        return str(round(size / 1024 / 1024 / 1024, 2)) + 'GB'

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='一个按大小删除文件的脚本')
    parser.add_argument('-f','--folder',type=str,default=os.getcwd(), help='要操作的文件夹')
    parser.add_argument('-s','--size', type=int, help='文件大小,单位为KB',default=0)
    parser.add_argument('-e','--ext', type=str, help='文件类型')
    parser.add_argument('-ch','--check', type=bool, help='是否检查文件大小',default=False)
    args = parser.parse_args()

    size = args.size * 1024
    all_files = get_all_files(args.folder,args.ext,size)
    if args.check:
        for filename in all_files:
            print(filename,show_filesize(filename))
    else:
        print('remove...')
        remove(all_files)
        print('done')

使用如下:

1
python .\remove.py -f D:\txt2img-images -s 10 -e txt -ch true
分享

码中人
作者
码中人
Web Developer