utils.py 4.5 KB
Newer Older
D
dongshuilong 已提交
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
import os
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
import hashlib
import shutil
from mod import image_list_manager


def setMenu(menu: QtWidgets.QMenu, text: str, triggered):
    """设置菜单"""
    action = menu.addAction(text)
    action.triggered.connect(triggered)


def fileMD5(file_path: str):
    """计算文件的MD5值"""
    md5 = hashlib.md5()
    with open(file_path, 'rb') as f:
        md5.update(f.read())
    return md5.hexdigest().lower()


def copyFile(from_path: str, to_path: str):
    """复制文件"""
    shutil.copyfile(from_path, to_path)
    return os.path.exists(to_path)


def removeFile(file_path: str):
    """删除文件"""
    if os.path.exists(file_path):
        os.remove(file_path)
    return not os.path.exists(file_path)


def fileExtension(file_path: str):
    """获取文件的扩展名"""
    return os.path.splitext(file_path)[1]


def copyImageToDir(self, from_image_path: str, to_dir_path: str):
    """复制图像文件到目标目录"""
    if not os.path.exists(from_image_path) and not os.path.exists(to_dir_path):
        return None
    md5 = fileMD5(from_image_path)
    file_ext = fileExtension(from_image_path)
    new_path = os.path.join(to_dir_path, md5 + file_ext)
    copyFile(from_image_path, new_path)
    return new_path


def oneKeyImportFromFile(from_path: str, to_path: str):
    """从其它图像库 from_path {image_list.txt} 导入到图像库 to_path {image_list.txt}"""
    if not os.path.exists(from_path) or not os.path.exists(to_path):
        return None
    if from_path == to_path:
        return None
    from_mgr = image_list_manager.ImageListManager(file_path=from_path)
    to_mgr = image_list_manager.ImageListManager(file_path=to_path)
    return oneKeyImport(from_mgr=from_mgr, to_mgr=to_mgr)


def oneKeyImportFromDirs(from_dir: str, to_image_list_path: str):
    """从其它图像库 from_dir 搜索子目录 导入到图像库 to_image_list_path"""
    if not os.path.exists(from_dir) or not os.path.exists(to_image_list_path):
        return None
    if from_dir == os.path.dirname(to_image_list_path):
        return None
    from_mgr = image_list_manager.ImageListManager()
    to_mgr = image_list_manager.ImageListManager(
        file_path=to_image_list_path)
    from_mgr.dirName = from_dir
    sub_dir_list = os.listdir(from_dir)
    for sub_dir in sub_dir_list:
        real_sub_dir = os.path.join(from_dir, sub_dir)
        if not os.path.isdir(real_sub_dir):
            continue
        img_list = os.listdir(real_sub_dir)
        img_path = []
        for img in img_list:
            real_img = os.path.join(real_sub_dir, img)
            if not os.path.isfile(real_img):
                continue
            img_path.append("{}/{}".format(sub_dir, img))
        if len(img_path) == 0:
            continue
        from_mgr.addClassify(sub_dir)
        from_mgr.resetImageList(sub_dir, img_path)
    return oneKeyImport(from_mgr=from_mgr, to_mgr=to_mgr)


def oneKeyImport(from_mgr: image_list_manager.ImageListManager,
                 to_mgr: image_list_manager.ImageListManager):
    """一键导入"""
    count = 0
    for classify in from_mgr.classifyList:
        img_list = from_mgr.realPathList(classify)
        to_mgr.addClassify(classify)
        to_img_list = to_mgr.imageList(classify)
        new_img_list = []
        for img in img_list:
            from_image_path = img
            to_dir_path = os.path.join(to_mgr.dirName, "images")
            md5 = fileMD5(from_image_path)
            file_ext = fileExtension(from_image_path)
            new_path = os.path.join(to_dir_path, md5 + file_ext)
            if os.path.exists(new_path):
                # 如果新文件 MD5 重复跳过后面的复制文件操作
                continue
            copyFile(from_image_path, new_path)
            new_img_list.append("images/" + md5 + file_ext)
            count += 1
        to_img_list += new_img_list
        to_mgr.resetImageList(classify, to_img_list)
    to_mgr.writeFile()
    return count


def newFile(file_path: str):
    """创建文件"""
    if os.path.exists(file_path):
        return False
    else:
        with open(file_path, 'w') as f:
            pass
        return True


def isEmptyDir(dir_path: str):
    """判断目录是否为空"""
    return not os.listdir(dir_path)


def initLibrary(dir_path: str):
    """初始化库"""
    images_dir = os.path.join(dir_path, "images")
    if not os.path.exists(images_dir):
        os.makedirs(images_dir)
    image_list_path = os.path.join(dir_path, "image_list.txt")
    newFile(image_list_path)
    return os.path.exists(dir_path)