Python 批量复制子文件 遍历删除空文件夹

9 篇文章 1 订阅
4 篇文章 0 订阅
该Python脚本用于查找并移动指定文件夹内大小超过特定值的图片文件。通过os模块遍历文件夹,使用argparse处理命令行参数,根据用户输入的文件路径、输出路径、文件大小和移动/复制选项,筛选图片并执行相应操作。支持多种图片格式,可以灵活选择移动或复制文件。
摘要由CSDN通过智能技术生成

一个文件夹有多个子文件夹和子文件,想要一次性找到出所有满足条件的子文件,并且把它们移动到指定文件夹里。

下面的代码是以寻找文件大小大于file_size的图片为例

# test.py
import os, argparse, shutil, time

def get_img_file(file_name, file_size, output_path=None):
    image_input_list = []
    image_output_file = []
    # 有输出路径
    if output_path:
        for parent, dir_names, file_names in os.walk(file_name):
            for file_name in file_names:
                if file_name.lower().endswith(('.bmp', '.gif', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
                    input_file_path = os.path.join(parent, file_name)
                    # 删除大小小于file_size的文件
                    #if os.path.getsize(input_file_path) < file_size:
                    #    os.remove(input_file_path)
                    #    print(input_file_path)
                    #    continue
                    #continue
                    if os.path.getsize(input_file_path) >= file_size:
                        output_file_path = os.path.join(output_path, file_name)
                        image_input_list.append(input_file_path)
                        image_output_file.append(output_file_path)
        return image_input_list, image_output_file
   # 无输出路径
    else:
        for parent, dir_names, file_names in os.walk(file_name):
            for file_name in file_names:
                if file_name.lower().endswith(('.bmp', '.gif', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
                    input_file_path = os.path.join(parent, file_name)
                    if os.path.getsize(input_file_path) >= file_size:
                        image_input_list.append(input_file_path)
        return image_input_list

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get All Image')
    parser.add_argument('-i', '--input', default='test', help='搜索文件夹路径')
    parser.add_argument('-o', '--output', default='test2', help='输出文件夹路径')
    parser.add_argument('-s', '--size', default=2048, help='文件大小过滤,单位KB')
    parser.add_argument('-m', '--move', default='true', help='是否移动文件')
    args = parser.parse_args()
    start_time = time.time()
    print(args)
    move_flag = True if args.move == 'true' else False
    file_size = int(int(args.size) * 1024)
    if not args.output and args.input:
        input_path = args.input
        image_input_list = get_img_file(input_path, file_size)
        print('结果:%d' % (len(image_input_list)))
    elif args.output and args.input:
        input_path = args.input
        output_path = args.output
        image_input_list, image_output_file = get_img_file(input_path, file_size, output_path)
        print('结果:%d' % (len(image_input_list)))
        for src, dst in zip(image_input_list, image_output_file):
            try:
                if move_flag:
                    shutil.move(src, dst)
                else:
                    shutil.copyfile(src, dst)
            except:
                print('Error copy %s %s' % (src, dst))
    print('耗时%ds' % (time.time() - start_time))

使用方法:
win+r,打开cmd

# 将“F:\test\test1”中的图片“剪切”到“F:\test\test2”中,图片大小要大于900KB
python test.py -i F:\test\test1 -o F:\test\test2 -m true -s 900

# 将“F:\test\test1”中的图片“复制”到“F:\test\test2”中,图片大小要大于900KB
python test.py -i F:\test\test1 -o F:\test\test2 -m false -s 900

# 将“F:\test\test1 111”中的图片“剪切”到“F:\test\test2 222”中,图片大小要大于5000KB
python test.py -i "F:\test\test1 111" -o "F:\test\test2 222" -m false -s 5000

# 输出“F:\test\test1”中的图片大小大于5000KB的文件数量
python test.py -i F:\test\test1 -o F:\test\test2 -m false -s 5000

删除空文件夹
遍历子文件夹,只要os.listdir为false就说明是空文件夹
os.remove操作是直接删除,而不是移动到回收站,所以使用要严谨

import os
dir_path = r'F:\test'
for root, dirs, files in os.walk(dir_path):
    if not os.listdir(root):
        os.rmdir(root)
        print(root)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值