栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

实用技巧分享——用Python解压复杂zip文件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实用技巧分享——用Python解压复杂zip文件

使用过Python中的标准库zipfile解压过zip格式压缩包的朋友们,可能遇到过,当压缩文件中的目录或文件名中包含中文等常见unicode字符时,典型如下面的例子:

使用zipfile的extract()或extractall()方法直接解压时,产生的解压结果名充斥着乱码,这一点我们通过调用namelist()方法就可以看出来:

from zipfile import ZipFile

# 读入压缩包文件
file = ZipFile('示例压缩包.zip')

# 查看压缩包内目录、文件名称
file.namelist()

这是因为zipfile中针对压缩包内容的编码兼容性差,但我们可以通过下面的函数自行矫正:

def recode(raw: str) -> str:
    '''
    编码修正
    '''
    
    try:
        return raw.encode('cp437').decode('gbk')
    
    except:
        return raw.encode('utf-8').decode('utf-8')
    
for file_or_path in file.namelist():
    
    print(file_or_path, ' -------> ' , recode(file_or_path))

  解决了文件名乱码的问题后,接下来我们就可以配合shutil与os标准库中的相关功能,实现将指定任意zip压缩包,完好地解压到指定的目录中,代码如下:

def zip_extract_all(src_zip_file: ZipFile, target_path: str) -> None:
    
    # 遍历压缩包内所有内容
    for file_or_path in file.namelist():
        
        # 若当前节点是文件夹
        if file_or_path.endswith('/'):
            try:
                # 基于当前文件夹节点创建多层文件夹
                os.makedirs(os.path.join(target_path, recode(file_or_path)))
            except FileExistsError:
                # 若已存在则跳过创建过程
                pass
        
        # 否则视作文件进行写出
        else:
            # 利用shutil.copyfileobj,从压缩包io流中提取目标文件内容写出到目标路径
            with open(os.path.join(target_path, recode(file_or_path)), 'wb') as z:
                # 这里基于Zipfile.open()提取文件内容时需要使用原始的乱码文件名
                shutil.copyfileobj(src_zip_file.open(file_or_path), z)
            
# 向已存在的指定文件夹完整解压当前读入的zip文件
zip_extract_all(file, '解压测试')

可以看到,效果完美:

好了,今天的分享就到这里,希望对大家有所帮助。

对于Python有兴趣想一起交流的,都可以加下微信,在这里我也准备了一份学习资料送给大家,主要包含爬虫入门(爬虫工作流程  http工作流程)、逆向工程、逆向算法、异步爬虫、安卓逆向这几个板块。(截图为部分展示)

 适合Python入门的朋友学习,都是精华,快来白嫖!

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861750.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号