두 폴더의 중복 파일을 효율적으로 삭제
이전에도 이 방법을 사용했는데 이미지가 너무 많아 삭제해야 할 이미지가 70만 장에 달해 삭제하는 데 10일 이상이 걸렸다. .
해결책
먼저 이미지의 복사본을 만든 다음 이름을 txt로 바꿉니다.
import os
def change_file_extension(path, old_ext, new_ext):
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(old_ext):
old_file = os.path.join(root, file)
new_file = os.path.splitext(old_file)[0] + new_ext
os.rename(old_file, new_file)
# 示例:将路径为 "C:\test" 下所有 .txt 文件的后缀修改为 .md
change_file_extension("D:\dataset\image\\1", ".jpg", ".txt")
이제 이미지 이름과 라벨이 동일하므로, 이미지에서 가장 많이 사용되는 파일명을 비교하여 찾아 txt 파일에 작성해 주세요.
import os
import codecs
# 指定两个文件夹的路径
folder1 = r'D:\dataset\image\1'
folder2 = r'D:\dataset\ann'
# 获取文件夹1中所有文件的文件名 (这里的场景是jpg)
files1 = set(os.listdir(folder1))
# 获取文件夹2中所有文件的文件名 (这里的场景是txt)
files2 = set(os.listdir(folder2))
# 计算出缺少的文件,即在文件夹1中出现但不在文件夹2中出现的文件
missing_files = files1 - files2
#将缺少的文件保存到txt中
path= 'D:\code\yolov8-pytorch-master\\needRM.txt'
lt = open(path, "w")
# 打印缺少的文件名
print("缺少的文件:")
for file in missing_files:
print(file)
lt.writelines(file + '\n') # 每个元素以空格间隔,一行元素写完并换行
needRM.txt 파일을 읽은 후 접미사를 다시 jpg로 변경하세요.
import codecs
import os
path = 'D:/code/yolov8-pytorch-master/needRM.txt' # 标签文件train路径
newpath = 'D:/code/yolov8-pytorch-master/needRMNew.txt' # 标签文件train路径
file = open(path, "r", encoding="utf8")
txt = file.read()
a = txt.replace(".txt", ".jpg") # read默认内容读出来是字符串格式
file.close() # 这一步必须关闭
file = open(newpath, "w", encoding='utf8')
file.write(a) # 把修改后的a写入文件
file.close()
이런 방식으로 삭제해야 하는 파일의 파일 이름을 얻을 수 있습니다(모두 이 txt 파일에 저장됨).
파일 이름에 따라 Image 폴더의 중복 파일을 삭제합니다.
import os
# 将待删除文件夹图片路径补全
file = open(r"D:\code\yolov8-pytorch-master\needRMNew.txt", "r")
list1 = file.readlines()
for i in list1:
i = i.strip('\n')
delPath = "D:\dataset\image\\1\\"+i
print("remove pic: "+ delPath, end="\n")
os.remove(delPath)
file.close()
마치다!
이전 방법에 비해 개선된 점은
이전에는 이중 탐색으로 시간 복잡도가 높았으나
이제는 set을 직접 사용하여 중복되지 않은 항목을 찾아 시간 복잡도를 줄인 것입니다.
Python은 두 폴더의 서로 다른 파일을 비교합니다.
Python 파일 작업, .txt 텍스트 파일 작업(읽기, 쓰기, 수정, 복사, 병합), json 텍스트 파일 작업, json 문자열과 사전 간 변환.