使用 ZipFile 中的 ImageIO 处理文件
Processing files with ImageIO from a ZipFile
我在尝试使用 imageio 从 zip 文件读取图像文件时遇到错误:
import zipfile
import glob
import imageio
from os.path import splitext
for database in glob.iglob('Datasets/*.zip'):
print(database)
zf = zipfile.ZipFile(database, 'r')
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
img = imageio.imread(file)
print(img.shape, end='')
这是回溯:
Datasets/first.zip
Traceback (most recent call last):
File "testZip.py", line 12, in <module>
img = imageio.imread(file)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/functions.py", line 200, in imread
reader = read(uri, format, 'i', **kwargs)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/functions.py", line 117, in get_reader
request = Request(uri, 'r' + mode, **kwargs)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/request.py", line 120, in __init__
self._parse_uri(uri)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/request.py", line 252, in _parse_uri
raise IOError("No such file: '%s'" % fn)
OSError: No such file: 'first/image_7395.png'
[Finished in 0.2s with exit code 1]
file
变量包含一个文件名,而不是实际的文件数据。错误非常明显:磁盘上不存在名为 first/image_7395.png
的文件 - 虽然它在 zip 中。您需要从 zip 中提取文件并将提取的文件用于 imageio
。例如:
for database in glob.iglob('Datasets/*.zip'):
print(database)
zf = zipfile.ZipFile(database, 'r')
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
ofile = zf.extract(file)
img = imageio.imread(ofile)
print(img.shape, end='')
# if you need to:
os.remove(ofile)
编辑:看起来 imageio 也可以从类似文件的对象中读取,在这种情况下,您可以使用 ZipFile.open() 并将其传递给 imageio。例如:
# ...
if extension == '.png':
with zf.open(file) as img_file:
img = imageio.read(img_file)
您正在尝试按名称打开 ZIP 中的图像。 imageio
不知道该怎么做。它假定您给了它一个真实的文件路径。您需要首先打开 zip 中的文件,为其提供一个文件对象。您也可以像@randomdude999 建议的那样先提取它。
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
img = imageio.imread(zf.open(file))
print(img.shape, end='')
我在尝试使用 imageio 从 zip 文件读取图像文件时遇到错误:
import zipfile
import glob
import imageio
from os.path import splitext
for database in glob.iglob('Datasets/*.zip'):
print(database)
zf = zipfile.ZipFile(database, 'r')
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
img = imageio.imread(file)
print(img.shape, end='')
这是回溯:
Datasets/first.zip
Traceback (most recent call last):
File "testZip.py", line 12, in <module>
img = imageio.imread(file)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/functions.py", line 200, in imread
reader = read(uri, format, 'i', **kwargs)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/functions.py", line 117, in get_reader
request = Request(uri, 'r' + mode, **kwargs)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/request.py", line 120, in __init__
self._parse_uri(uri)
File "/usr/local/anaconda3/lib/python3.6/site-packages/imageio/core/request.py", line 252, in _parse_uri
raise IOError("No such file: '%s'" % fn)
OSError: No such file: 'first/image_7395.png'
[Finished in 0.2s with exit code 1]
file
变量包含一个文件名,而不是实际的文件数据。错误非常明显:磁盘上不存在名为 first/image_7395.png
的文件 - 虽然它在 zip 中。您需要从 zip 中提取文件并将提取的文件用于 imageio
。例如:
for database in glob.iglob('Datasets/*.zip'):
print(database)
zf = zipfile.ZipFile(database, 'r')
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
ofile = zf.extract(file)
img = imageio.imread(ofile)
print(img.shape, end='')
# if you need to:
os.remove(ofile)
编辑:看起来 imageio 也可以从类似文件的对象中读取,在这种情况下,您可以使用 ZipFile.open() 并将其传递给 imageio。例如:
# ...
if extension == '.png':
with zf.open(file) as img_file:
img = imageio.read(img_file)
您正在尝试按名称打开 ZIP 中的图像。 imageio
不知道该怎么做。它假定您给了它一个真实的文件路径。您需要首先打开 zip 中的文件,为其提供一个文件对象。您也可以像@randomdude999 建议的那样先提取它。
for file in zf.namelist():
basename,extension = splitext(file)
if extension == '.png':
img = imageio.imread(zf.open(file))
print(img.shape, end='')