首页 > 编程语言 >Python: unZip

Python: unZip

时间:2024-04-30 15:57:19浏览次数:20  
标签:unZip name zip Python file import path dir

 

import os
import socket
import struct
from unidecode import unidecode
import re
import json
import requests
from bs4 import BeautifulSoup
import gzip
import zipfile
from pathlib import Path
from zipfile import ZipFile

class Czip:
    """
   解压zip文件
    """
    
    @staticmethod
    def unGz(file_name:str):
        """
        ungz zip file  import gzip

        :param file_name:
        :return:
        """
        f_name = file_name.replace(".gz", "")
        # 获取文件的名称,去掉
        g_file = gzip.GzipFile(file_name)
        # 创建gzip对象
        open(f_name, "w+").write(g_file.read())
        # gzip对象用read()打开后,写入open()建立的文件里。
        g_file.close()
        # 关闭gzip对象

    @staticmethod
    def decode(strSource:str)->str:
        """
         编码转换
        :param strcourece:
        :return:
        """

        try:
            strNew = strSource.encode('cp437').decode('gbk')

        except:
            strNew = strSource.encode('utf-8').decode('utf-8')
        return strNew

    @staticmethod
    def sort_dir(e)->int:
        """

        :param e:
        :return:
        """

        return len(e.split("\\"))

    @staticmethod
    def rename(file_list, dir_list):
        """

        :param file_list:
        :param dir_list:
        :return:
        """
        # 按文件夹等级排序
        dir_list.sort(key=Czip.sort_dir, reverse=True)
        # 重命名文件夹
        for dir in dir_list:
            name = Czip.decode(os.path.basename(dir))
            if os.path.basename(dir) != name:
                Path(dir).rename(os.path.join(os.path.dirname(dir), name))
        # 重命名文件
        for file in file_list:
            new_file_path = Czip.decode(file)
            old_file_path = os.path.join(os.path.dirname(new_file_path), os.path.basename(file))
            if old_file_path != new_file_path:
                Path(old_file_path).rename(new_file_path)

    @staticmethod
    def unZipDu(zip_file:str, out_dir:str):
        """
        创建重命名列表,解决中文文件名 这需要考虑用户的语言环境进行转换

        :param zip_file: 需要解压文件名
        :param out_dir:解压的所放的文件夹名
        :return:
        """
        file_list = []
        dir_list = []
        # 解压
        with ZipFile(zip_file, allowZip64=True) as Z:
            for path in Z.namelist():
                path = Z.extract(path, out_dir)
                if os.path.isfile(path):
                    file_list.append(path)
                else:
                    dir_list.append(path)
        # 重命名
        Czip.rename(file_list, dir_list)
        ZipFile.close()

    @staticmethod
    def supportGbk(zip_file: ZipFile):
        """
        from zipfile import ZipFile
        用法:
        with supportGbk(ZipFile(r'./中文.zip')) as zfp:
            zfp.extractall(r'./中文不乱码')
        :param zip_file:
        :return:
        """
        name_to_info = zip_file.NameToInfo
        # copy map first
        for name, info in name_to_info.copy().items():
            real_name = name.encode('cp437').decode('gbk')
            if real_name != name:
                info.filename = real_name
                del name_to_info[name]
                name_to_info[real_name] = info
        return zip_file

    @staticmethod
    def supportGbkDu(zipfile:str,outdir:str):
        """
        from zipfile import ZipFile
        解决中文名称的文件名乱码问题
        用法:
        Common.czip.CzIp.supportGbkDu("geovindu.zip","geovinZip")
        :param zipfile: 所要解压的压缩文件
        :param outdir:解压所放至的文件夹名
        :return:
        """

        unZipFile = ZipFile(zipfile)
        name_to_info = unZipFile.NameToInfo
        # copy map first
        for name, info in name_to_info.copy().items():
            real_name = name.encode('cp437').decode('gbk')
            if real_name != name:
                info.filename = real_name
                del name_to_info[name]
                name_to_info[real_name] = info

        unZipFile.extractall(outdir)
        unZipFile.close()
       

    @staticmethod
    def unZip(file_name:str):
        """
        unzip zip file  import zipfile
        存在中文乱码
        :param file_name:
        :return:
        """
        zip_file = zipfile.ZipFile(file_name)
        if os.path.isdir(file_name + "_files"):
            pass
        else:
            os.mkdir(file_name + "_files")
        for names in zip_file.namelist():
            zip_file.extract(names, file_name + "_files/")
        zip_file.close()

  

调用:

    #中文文件名乱码
    #Common.czip.CzIp.unZip("geovindu.zip")
    #中文无乱码
    #如果文件夹不存在,继续解压
    if not os.path.exists(os.path.splitext("geovinduZip")[0]):
        Common.czip.Czip.unZipDu("geovindu.zip","geovinduZip")

    #with Common.czip.Czip.supportGbk(ZipFile(r'./geovindu.zip')) as zfp:
    #   zfp.extractall(r'./中文不乱码')
    Common.czip.Czip.supportGbkDu("geovindu.zip","geovinZip")

  

标签:unZip,name,zip,Python,file,import,path,dir
From: https://www.cnblogs.com/geovindu/p/18168152

相关文章

  • python
                                搜索复制......
  • pip debug —— 查看当前版本的python解释器支持的wheel包类型
    在pip安装依赖时,我们可能会遇到依赖包无法下载成功的情况解决办法:去寻找对应版本的wheel包下载到本地搜寻wheel包网址:以python-ladp为例格式示例:python_ldap-2.5.1-cp27-cp27m-win32.whl2.5.1代表版本号cp27代表支持python27版本win32代表支持系统位数可以通过pipdeb......
  • 关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序
    背景:哈希码参数校验防参数篡改。前端下发接口时对参数按约定秘钥和逻辑进行加密,后端在获取到请求后对请求参数以同样的秘钥和逻辑加密计算得出哈希值,再与请求的哈希值对比,如果不一致则证明参数被篡改。前端代码:对json对象进行了按key排序1letdataTmp=this.de......
  • Python-与-TensorFlow2-生成式-AI(五)
    Python与TensorFlow2生成式AI(五)原文:zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76译者:飞龙协议:CCBY-NC-SA4.0第十二章:用生成式人工智能玩视频游戏:GAIL在之前的章节中,我们已经看到如何使用生成式人工智能来生成简单的(受限玻尔兹曼机器)和复杂的(变分自动......
  • python grpc简单使用
    pythongrpc简单使用1、rpc和grpc关系RPC(RemoteProcedureCallProtocol),直译来看就是远程过程调用协议。它提供了一套机制,使得应用程序之间可以进行通信,使用时客户端调用server端的接口就像调用本地的函数一样方便。并且server端和client端不限语言,任何语言遵循protobuf协议......
  • python 对文件夹重命名
    importosdefrename_folders(root_dir,level=1,parent_prefix=''):#计数器,用于生成唯一的名称counter=1#遍历文件夹fordirpath,dirnames,filenamesinos.walk(root_dir):#只处理文件夹(不处理文件)......
  • python脚本获取当前浏览器客户端的公共ip以及其详细信息
    python脚本获取当前客户端的公共ip以及其详细信息importrequestsfromflaskimportFlask,request,make_response,send_from_directoryfromdatetimeimportdatetimeimportasynciofromhypercorn.asyncioimportservefromhypercorn.configimportConfigimportos......
  • Python重试任务模块tenacity
    1.简介在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic。tenacity是一个重试库,使用python语言编写,它能够让我们在任务的重......
  • Python-重试任务模块tenacity
     1.软硬件环境windows1164bits python3.6tenacity2.简介在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic。tenaci......
  • 社会网络分析及其Python实现
    社会网络分析(SocialNetworkAnalysis,SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会网络分析旨在......