一个文件夹有多个子文件夹和子文件,想要一次性找到出所有满足条件的子文件,并且把它们移动到指定文件夹里。
下面的代码是以寻找文件大小大于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)