| import zipfile |
| import os |
| import io |
| import time |
| from PIL import Image |
|
|
|
|
| class ZipReader(object): |
| zip_bank = dict() |
|
|
| def __init__(self): |
| super(ZipReader, self).__init__() |
|
|
| @staticmethod |
| def get_zipfile(path): |
| zip_bank = ZipReader.zip_bank |
| if path in zip_bank: |
| return zip_bank[path] |
| else: |
| print("creating new zip_bank") |
| zfile = zipfile.ZipFile(path, 'r') |
| zip_bank[path] = zfile |
| return zip_bank[path] |
|
|
| @staticmethod |
| def split_zip_style_path(path): |
| pos_zip_at = path.index('.zip@') |
| if pos_zip_at == len(path): |
| print("character '@' is not found from the given path '%s'" % (path)) |
| assert 0 |
| pos_at = pos_zip_at + len('.zip@') - 1 |
|
|
| zip_path = path[0: pos_at] |
| folder_path = path[pos_at + 1:] |
| folder_path = str.strip(folder_path, '/') |
| return zip_path, folder_path |
|
|
| @staticmethod |
| def list_folder(path): |
| zip_path, folder_path = ZipReader.split_zip_style_path(path) |
|
|
| zfile = ZipReader.get_zipfile(zip_path) |
| folder_list = [] |
| for file_foler_name in zfile.namelist(): |
| file_foler_name = str.strip(file_foler_name, '/') |
| if file_foler_name.startswith(folder_path) and \ |
| len(os.path.splitext(file_foler_name)[-1]) == 0 and \ |
| file_foler_name != folder_path: |
| if len(folder_path) == 0: |
| folder_list.append(file_foler_name) |
| else: |
| folder_list.append(file_foler_name[len(folder_path)+1:]) |
|
|
| return folder_list |
|
|
| @staticmethod |
| def list_files(path, extension=['.*']): |
| zip_path, folder_path = ZipReader.split_zip_style_path(path) |
|
|
| zfile = ZipReader.get_zipfile(zip_path) |
| file_lists = [] |
| for file_foler_name in zfile.namelist(): |
| file_foler_name = str.strip(file_foler_name, '/') |
| if file_foler_name.startswith(folder_path) and str.lower(os.path.splitext(file_foler_name)[-1]) in extension: |
| if len(folder_path) == 0: |
| file_lists.append(file_foler_name) |
| else: |
| file_lists.append(file_foler_name[len(folder_path)+1:]) |
|
|
| return file_lists |
|
|
| @staticmethod |
| def imread(path): |
| zip_path, path_img = ZipReader.split_zip_style_path(path) |
| zfile = ZipReader.get_zipfile(zip_path) |
| data = zfile.read(path_img) |
| im = Image.open(io.BytesIO(data)) |
| return im |
|
|
| @staticmethod |
| def read(path): |
| zip_path, path_img = ZipReader.split_zip_style_path(path) |
| zfile = ZipReader.get_zipfile(zip_path) |
| data = zfile.read(path_img) |
| return data |
|
|