Python使用patool通用方法读取压缩文件列表(rar、zip、ARJ等)
python读取压缩文件有,针对不同格式的压缩文件有相应的python包,比如.rar、.zip格式文件,相应代码如下:
import zipfile
f = zipfile.ZipFile('zip后缀文件路径')
f.namelist()#获取压缩文件列表信息
from unrar import rarfile
f=rarfile.RarFile('rar后缀文件路径')
f.namelist()#获取压缩文件列表信息
如上所示:不同压缩文件需要不同的python包,如果遇到特殊的压缩格式(比如ARJ压缩文件,目前尚未找到相应的处理模块)能不能统一处理呢,当然可以,不过需要些代码去实现,这里我们用到了patool模块,大致流程是通过该模块执行cmd命令(前提是需要安装rar及zip解压缩软件,cmd命令会获取当前系统的program命令),然后再获取输出的字符串(包含压缩文件信息及列表),在进行处理,相关代码如下:
import patoolib
def get_list(archive, verbosity=1, program=None, interactive=True):
#改造的list_archive方法,该方法是patool提供的,按道理可以获取列表信息,但是只是在控制台中将结果进行了输出
util.check_existing_filename(archive)
if verbosity >= 0:
util.log_info("Listing %s ..." % archive)
#下述方法依照patool提供的方法进行微调输出cmd命令
archive_cmdlist = _handle_archive_cmd(archive, 'list', verbosity=verbosity,
interactive=interactive, program=program)
if isinstance(archive_cmdlist, tuple):
cmdlist, runkwargs = archive_cmdlist
else:
cmdlist, runkwargs = archive_cmdlist, {}
#下述是重点,调用backtick进行相关压缩信息的输出,注意:涉及中文需要encoding="GBK"避免乱码,utf-8似乎不行
res = util.backtick(cmdlist,encoding="GBK")
#返回字符串数据需要进一步处理
return res
#调用方法获取输出字符串
res_str=patoolib.get_list(file_path)
if __name__ == "__main__":
if file_list and "\r\n" in file_list:
#按换行符进行切分
file_list = file_list.split("\r\n")
#根据特定字符串进行边界提取
list_range = [i for i, v in enumerate(file_list) if "-------------" in v]
if len(list_range) == 2:
res_list = [item.split(' ')[-1] for item in file_list[list_range[0] + 1:list_range[1]]]
for file in res_list:
#输出结果
print(file)