我正在尝试使用 glob()
方法读取名为 data1.zip
的.zip
存档中的所有文件。
import glob
from zipfile import ZipFile
archive = ZipFile('data1.zip','r')
files = archive.read(glob.glob('*.jpg'))
错误信息:
TypeError: unhashable type: 'list'
我正在使用的问题的解决方案是:
files = [archive.read(str(i+1)+'.jpg') for i in range(100)]
这很糟糕,因为我假设我的文件被命名为 1.jpg
、2.jpg
等。
有没有更好的方法来使用 python 最佳实践来做到这一点?不一定需要使用glob()
glob
不会查看您的存档,它只会为您提供当前工作目录中jpg
文件的列表。
ZipFile
已经有返回有关存档中文件信息的方法:namelist
返回名称,infolist
返回ZipInfo
对象,其中还包括元数据。
您只是在寻找:
archive = ZipFile('data1.zip', 'r')
files = archive.namelist()
或者,如果您只需要.jpg
文件:
files = [name for name in archive.namelist() if name.endswith('.jpg')]
或者,如果要读取每个文件的所有内容:
files = [archive.read(name) for name in archive.namelist()]
虽然我可能更愿意制作一个将名称映射到内容的字典:
files = {name: archive.read(name) for name in archive.namelist()}
这样您就可以访问如下内容:
files['1.jpg']
或者使用 files.keys()
等获取文件列表。
我找不到一种方法来清除 zip 存档的内容,所以我提取到一个临时目录并 glob 它。
import os
import glob
import zipfile
import tempfile
with tempfile.TemporaryDirectory() as tempdir:
# extract zip to temporary directory to perform glob operations on it
with zipfile.ZipFile(your_zip_file) as zf:
zf.extractall(str(tempdir))
# apply any glob statement here
newest_one = max(glob.glob(f"{tempdir}/**/*", recursive=True), key=os.path.getctime)