Как читать файлы в папке внутри zip-папки в Python - PullRequest
0 голосов
/ 29 марта 2020

У меня есть папка с архивом, в которой есть подпапка, а в подпапке содержится более 60000 изображений. Мне было интересно, если есть способ прочитать все изображения в подпапке, не извлекая ее (так как размер папок изображений составляет ~ 100 ГБ).

Я думал об использовании пакета zipfile в python. Однако я не смогу использовать функцию open внутри модуля, так как не знаю, как перебирать всю подпапку. Было бы здорово, если бы вы могли предоставить мне какие-либо материалы о том, как это сделать

with zipfile.ZipFile("/home/diliptmonson/abc.zip","r") as zip_ref:
    train_images=zip_ref.open('train/86760c00-21bc-11ea-a13a-137349068a90.jpg')```

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Вы можете использовать следующее решение:

  • Откройте ZIP-файл и выполните итерацию содержимого, как описано здесь .
  • Убедитесь, что расширение файла .jpg.
  • Считывание двоичных данных изображения указанного элемента c (файл в папке) из zip.
  • Декодировать двоичные данные в изображение, используя cv2.imdecode.

Вот код:

from zipfile import ZipFile
import numpy as np
import cv2
import os

# https://thispointer.com/python-how-to-get-the-list-of-all-files-in-a-zip-archive/
with ZipFile("abc.zip", "r") as zip_ref:
   # Get list of files names in zip
   list_of_files = zip_ref.namelist()

   # Iterate over the list of file names in given list & print them
   for elem in list_of_files:
       #print(elem)
       ext = os.path.splitext(elem)[-1]  # Get extension of elem

       if ext == ".jpg":
           # Read data in case extension is ".jpg"
           in_bytes = zip_ref.read(elem)

           # Decode bytes to image.
           img = cv2.imdecode(np.fromstring(in_bytes, np.uint8), cv2.IMREAD_COLOR)

           # Show image for testing
           cv2.imshow('img', img)
           cv2.waitKey(1000)

cv2.destroyAllWindows()
0 голосов
/ 29 марта 2020

Используйте for-l oop:

# namelist lists all files
for file in zip_ref.namelist():
   opened_file = zip_ref.open(file)
   # do stuff with your file 
...