import datetime import os import tarfile import time import numpy as np from hard_disk_storage import HardDiskStorage hard_disk_db = HardDiskStorage() def un_tar(path, file_name_list, save_path): # untar zip file file_name = file_name_list[0] tar_name = str(file_name[:file_name.index("_")]) + '.tar.gz' with tarfile.open(os.path.join(save_path, tar_name), 'w:gz') as tf: for image_name in file_name_list: tf.add(os.path.join(path, image_name), arcname=image_name) return tar_name def find_image(image_path): image_key = None zip_list = [] all_flie_name = os.listdir(image_path) for file_name in all_flie_name: if file_name.endswith('.jpeg'): file_name = file_name[:file_name.index("_")] zip_list.append(file_name) zip_list = list(set(zip_list)) zip_list.sort() if len(zip_list) > 1: image_key = zip_list[0] return image_key def find_pack_image(image_path, start_swith): zip_list = [] all_flie_name = os.listdir(image_path) for file_name in all_flie_name: if file_name.endswith('.jpeg') and file_name.startswith(start_swith): zip_list.append(file_name) zip_list.sort() return zip_list def onload_mask(mask_path, IMAGE_SHAPE): mask_dict = {} all_flie_name = os.listdir(mask_path) for file_name in all_flie_name: if file_name.endswith('.bin') and file_name.startswith('mask'): key = file_name[file_name.index("_") + 1:-4] path = mask_path + '/' + file_name mask = np.fromfile(path, dtype=np.bool_) mask.shape = IMAGE_SHAPE mask_dict[key] = mask return mask_dict def tar_check(path, name_list, tar_name): with tarfile.open(tar_name, 'r:gz') as tar: if len(name_list) > len(tar.getnames()): return False else: original_size = 0 for image_name in name_list: original_size = original_size + os.path.getsize(path + str(image_name)) size = 0 for ti in tar: if ti.isreg(): size = size + ti.size if original_size <= size: return True else: return False def delete_image_bmp(path, name_list): for image_name in name_list: dirPath = path + str(image_name) if (os.path.exists(dirPath)): os.remove(dirPath) else: print("要删除的文件不存在!") if __name__ == '__main__': path = '/data/img_data/' save_path = '/data/img_gz/' sql = "SELECT uuid,time_begin,cage_number from measurement_data ORDER BY id desc limit 1;" res = hard_disk_db.execute_sql(sql, None) if res: uuid, time_begin, cage_number = res[0]['uuid'], str(res[0]['time_begin'])[:10], str(res[0]['cage_number']) this_path = os.path.join(save_path, time_begin + '_' + cage_number) if not os.path.exists(this_path): os.makedirs(this_path) # 打包部分 key = find_image(path) # 获取符合打包要求的文件名(时间戳) if key != None: name_list = find_pack_image(path, key) # 获取符合打包要求的文件名列表 tar_name = un_tar(path, name_list, this_path) # 压缩,返回压缩包的名称 result = tar_check(path, name_list, os.path.join(this_path, tar_name)) # 大小检查 if result == True: # pass delete_image_bmp(path, name_list) # 删除原始数据 # 将本次打包信息插入数据库 sql = f"insert into package_data (uuid, package_name, datetime, gz_path) " \ f"values (%s,%s,%s,%s)" val = (uuid, tar_name, str(datetime.datetime.now()), this_path) hard_disk_db.execute_sql(sql, val) print('finsh') else: print('非法key:', key) else: print('当前非测量中')