Python使用ZipFile获取压缩包不含目录项的文件列表
ZipFile获取文件列表时过滤目录项的实现方案
直接遍历f.filelist拿到的路径列表会同时包含目录和文件,用固定位置切片的方式兼容性很差,遇到无外层目录的单文件压缩包就会出错,最稳定的实现方式是利用ZipInfo对象自带的目录判断方法过滤。
原始问题代码
from zipfile import ZipFile with ZipFile("test.zip", "r") as f: f.extractall(".") names = [file.filename for file in f.filelist] print(names)
运行输出(混入了目录项):
['New folder/', 'New folder/asdasd.txt', 'New folder/asdasdsad.txt']
期望输出(仅保留文件路径):
['New folder/asdasd.txt', 'New folder/asdasdsad.txt']
修正后代码
在列表推导式中增加判断,过滤掉所有目录类型的条目即可,适配任意目录结构的zip压缩包:
from zipfile import ZipFile with ZipFile("test.zip", "r") as f: f.extractall(".") names = [file.filename for file in f.filelist if not file.is_dir()] print(names)
注意点
- 不要依赖「目录项排在列表最前」的隐含规则,不同工具打包的zip文件,filelist的条目顺序没有统一规范,靠位置切片过滤很容易出问题
is_dir()是zipfile模块内置的判断方法,会自动识别以路径分隔符结尾的目录条目,判断逻辑准确,不需要自己手写字符串结尾判断。
内容的提问来源于stack exchange,提问作者czerwonyjakcegla
相关产品推荐
相关产品推荐

