python读取压缩文件(rar、zip、ARJ等等)列表的通用方法(patool)

python读取压缩文件有,针对不同格式的压缩文件有相应的python包,比如.rar、.zip格式文件,相应代码如下:

  • zip后缀文件需要zipfile模块
import zipfile
f = zipfile.ZipFile('zip后缀文件路径')
f.namelist()#获取压缩文件列表信息
  • rar后缀文件需要unrar模块
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)

你可能感兴趣的:(python,windows,linux)