|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
import zipfile |
|
|
import io |
|
|
import numpy as np |
|
|
from PIL import Image |
|
|
from PIL import ImageFile |
|
|
|
|
|
ImageFile.LOAD_TRUNCATED_IMAGES = True |
|
|
|
|
|
|
|
|
def is_zip_path(img_or_path): |
|
|
"""judge if this is a zip path""" |
|
|
return '.zip@' in img_or_path |
|
|
|
|
|
|
|
|
class ZipReader(object): |
|
|
"""A class to read zipped files""" |
|
|
zip_bank = dict() |
|
|
|
|
|
def __init__(self): |
|
|
super(ZipReader, self).__init__() |
|
|
|
|
|
@staticmethod |
|
|
def get_zipfile(path): |
|
|
zip_bank = ZipReader.zip_bank |
|
|
if path not in zip_bank: |
|
|
zfile = zipfile.ZipFile(path, 'r') |
|
|
zip_bank[path] = zfile |
|
|
return zip_bank[path] |
|
|
|
|
|
@staticmethod |
|
|
def split_zip_style_path(path): |
|
|
pos_at = path.index('@') |
|
|
assert pos_at != -1, "character '@' is not found from the given path '%s'" % path |
|
|
|
|
|
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=None): |
|
|
if extension is None: |
|
|
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 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 |
|
|
|
|
|
@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) |
|
|
try: |
|
|
im = Image.open(io.BytesIO(data)) |
|
|
except: |
|
|
print("ERROR IMG LOADED: ", path_img) |
|
|
random_img = np.random.rand(224, 224, 3) * 255 |
|
|
im = Image.fromarray(np.uint8(random_img)) |
|
|
return im |
|
|
|