吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1293|回复: 12
收起左侧

[Python 转载] Python筛选并删除两个文件夹中不同文件名的文件

[复制链接]
8wekyb3d8bbwe 发表于 2024-4-3 23:42
本帖最后由 8wekyb3d8bbwe 于 2024-4-3 23:48 编辑

本人自从注册账号以来第一次发帖,本帖仅为发帖试验,如有错误、重复、不明之处望请批评指正,侵删。


本人目前正在参加毕业实习,其中有个项目是给A文件夹内图片打上json标签,标签文件(与A文件夹内对应图片文件名相同,只不过后缀为.json)存放在B文件夹。其中A文件夹有些图片无法打标签,需要删掉,但在打标签过程中一个个删图片比较麻烦,于是我搜罗并稍作改进了个py脚本来实现批量删掉A文件夹内与B文件夹内标签文件文件名不同的图片。
无标题.png

可以发现A文件夹中有很多与B文件夹文件名不同的文件,故使用py脚本删除之。
[Python] 纯文本查看 复制代码
# 筛选并删除两个文件夹中不同文件名的文件
#  In[]
import os
filePath1 = r"C:\123"  #A的文件夹,及要比对的文件夹
filePath2 = r"C:\456"  #B文件夹,即要处理的文件夹
list1 = os.listdir(filePath1)
file_list1 = [] #1中的文件名列表 不带后缀
for i in list1:
    file_list1.append(os.path.splitext(i)[0])
#print(file_list1)
#  In[]
list2 = os.listdir(filePath2)
file_list2 = [] #2中的文件名列表 不带后缀
for i in list2:
    file_list2.append(os.path.splitext(i)[0])
#print(file_list2)
#  In[]
#找出没有标注的图片名称列表
b = [y for y in file_list2 if y not in file_list1]
#把这些列表加上扩展名 然后在filePath2将其删除
for i in b:
    for dirpath, dirname, filename in os.walk(filePath2):
        if i+'.png' in filename:
            print(os.path.join(filePath2,i+'.png'))
            os.remove(os.path.join(filePath2,i+'.png'))

此代码要修改的就是“filePath”里的“做比对的文件夹”和“要处理的文件夹”的文件夹相对路径(注意不是绝对路径),和倒数第一二三行“i+'.png'”里的“.png”扩展名了,把它修改为你要删除的文件类型的扩展名。
执行后,即可删除两个文件夹中不同文件名的文件。
无标题1.png

无标题2.png

特别注意的是,Python OS库里的os.remove函数不能将文件移动到回收站,而是直接彻底删除它!Python标准库中并没有直接将文件移动到回收站的函数。所以我们需要安装第三方库send2trash。
[Python] 纯文本查看 复制代码
pip install send2trash

然后在代码开头插入“from send2trash import send2trash”,把最后一行改为“send2trash(os.path.join(filePath2,i+'.png'))”即可实现不彻底删除而是移动到回收站。
改动后的代码如下:
[Python] 纯文本查看 复制代码
# 筛选并删除两个文件夹中不同文件名的文件
#  In[]
import os
from send2trash import send2trash
filePath1 = r"C:\123"  #A的文件夹,及要比对的文件夹
filePath2 = r"C:\456"  #B文件夹,即要处理的文件夹
list1 = os.listdir(filePath1)
file_list1 = [] #1中的文件名列表 不带后缀
for i in list1:
    file_list1.append(os.path.splitext(i)[0])
#print(file_list1)
#  In[]
list2 = os.listdir(filePath2)
file_list2 = [] #2中的文件名列表 不带后缀
for i in list2:
    file_list2.append(os.path.splitext(i)[0])
#print(file_list2)
#  In[]
#找出没有标注的图片名称列表
b = [y for y in file_list2 if y not in file_list1]
#把这些列表加上扩展名 然后在filePath2将其删除
for i in b:
    for dirpath, dirname, filename in os.walk(filePath2):
        if i+'.png' in filename:
            print(os.path.join(filePath2,i+'.png'))
            send2trash(os.path.join(filePath2,i+'.png'))


以上为本人毕业实习时总结的经验之一,就当发帖试验了。


来源:https://blog.csdn.net/qq_29487479/article/details/134849839

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 8wekyb3d8bbwe 发表于 2024-4-7 14:36
        统一回复一下,这个帖子要表明的意思是,把两个文件夹下文件名不同的文件删了,留下的是文件名相同但扩展名不同的文件,不是两个相同的文件!实际的用途在于处理文件标签等工作:

        举个例子,开发一款养鸡场智能巡检机器人,需要训练鸡只识别模型,相机拍了几千张图片,后续需要人工使用labelme工具把这些图片一一标上鸡只的位置(给鸡只打标签),即用矩形框在原图片文件框出鸡只,框完后会在另一个文件夹下生成与图片文件文件名相同的标签文件(.json格式),但有的图片不需要框,于是就产生了很多废弃图片,如果在打标签过程中一个个删图片太麻烦,故用此段代码可以一键批量删除。
weishaovvv 发表于 2024-4-22 11:43
pltuotuo 发表于 2024-4-8 12:32
感谢分享,整理大量照片或文件,同时还有备注的时候用得上。
 楼主| 8wekyb3d8bbwe 发表于 2024-4-7 14:41
52soft 发表于 2024-4-4 07:46
把不同的文件给删了,留下两个相同的文件?

看第九楼我回复的
 楼主| 8wekyb3d8bbwe 发表于 2024-4-7 14:40

看第九楼我回复的
jisugui 发表于 2024-4-4 14:11
可以可以,学习了
wsasecy 发表于 2024-4-4 08:47

脚本里的功能拿来引申而不是直接套用,或许用来作为完全同步这样的扩展吧。
義薄云天 发表于 2024-4-4 08:02

学习为主
52soft 发表于 2024-4-4 07:46
把不同的文件给删了,留下两个相同的文件?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表