我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python如何拆分ZIP文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python如何拆分ZIP文件

Python拆分ZIP文件

同事接到个任务,每周拆分下发zip文件。

文件样子如下

目录下有很多文件,要按网点下发。这个总不能每次都手工做吧。 python 脚本搞起!

需要 2个库

import os
import zipfile

先解压到临时目录,再遍历压缩成新zip文件。注意中文字符问题。

上代码

# encoding: utf-8
"""
@author: 陈年椰子
@contact: hndm@qq.com
@version: 1.0
@project:MyTools 
@file: zip_work.py
@time: 2021-9-13 15:48
说明
"""
import os
import zipfile
 
 
def dfs_get_zip_file(input_path,result):
    # 遍历目录列表
    files = os.listdir(input_path)
    for file in files:
        if os.path.isdir(input_path+'/'+file):
            dfs_get_zip_file(input_path+'/'+file,result)
        else:
            result.append(input_path+'/'+file)
 
def zip_path(input_path,output_path,output_name,up_path=""):
    # input_path 要压缩的目录
    # output_path zip文件存放目录
    # output_name zip文件名
    # up_path zip包需要剔除的父目录,避免压缩包内目录过深
    f = zipfile.ZipFile(output_path+'/'+output_name,'w',zipfile.ZIP_DEFLATED)
    filelists = []
    dfs_get_zip_file(input_path,filelists)
    for file in filelists:
        f.write(file,file.replace(up_path,''))
    f.close()
    return output_path+r"/"+output_name
 
 
def get_category_dir_zip(filepath, ext_dir, up_path = ""):
    #遍历filepath下所有文件,包括子目录 , 找到网点目录,压缩成zip文件
    # 按需要修改压缩逻辑 , 我这里是按网点机构分别压缩
    cate_dict = {'469030':'21',
                '469035':'23',
                '469031':'24',
                '469027':'19',
                '469003':'13',
                '469025':'17',
                '469007':'16',
                '460101':'11',
                '469033':'25',
                '469028':'26',
                '469034':'27',
                '469002':'14',
                '469036':'28',
                '460201':'12',
                '469026':'22',
                '469006':'20',
                '469005':'18',
                '469001':'15',
                }
    files = os.listdir(filepath)
    if os.path.isdir(ext_dir):
        pass
    else:
        os.mkdir(ext_dir)
    for fi in files:
        fi_d = os.path.join(filepath,fi)
        if os.path.isdir(fi_d):
            if fi.find("46")==0:
                zip_file_cnt = 0
                ctg_dir_list = os.listdir(filepath)
                for ci in ctg_dir_list:
                    ctg_dir = os.path.join(filepath, ci)
                    if os.path.isdir(ctg_dir):
                        zip_file = "{}.zip".format(ci[:6])
                        zip_file_dir = os.path.join(ext_dir, zip_file)
 
                        if os.path.exists(zip_file_dir):  # 如果文件存在 删除文件
                            os.remove(zip_file_dir)
                        print('压缩', ctg_dir, zip_file_dir, ext_dir)
                        zip_path(ctg_dir, ext_dir, zip_file, up_path)
                        zip_file_cnt = zip_file_cnt + 1
                return zip_file_cnt
            else:
                return get_category_dir_zip(fi_d, ext_dir)
 
 
 
 
def sfp_unzip(file_path, ext_dir):
    """unzip zip file"""
    zip_file = zipfile.ZipFile(file_path)
    if os.path.isdir(ext_dir):
        pass
    else:
        os.mkdir(ext_dir)
    zip_i = 0
 
    for names in zip_file.namelist():
        zip_i = zip_i + 1
        # 避免中文出现乱码
        gbk_names = names.encode('cp437').decode('gbk')
        file_size = zip_file.getinfo(names).file_size
        new_path = os.path.join(ext_dir, gbk_names)
        # 判断文件是文件夹还是文件
        if file_size > 0:
            # 是文件,通过open创建文件,写入数据
            with open(file=new_path, mode='wb') as f:
                # zf.read 是读取压缩包里的文件内容
                f.write(zip_file.read(names))
        else:
            # 是文件夹,就创建
            os.mkdir(new_path)
    zip_file.close()
    return zip_i
 
if __name__=="__main__":
    # 解压文件
    file_cnt = sfp_unzip("zip/xyk.zip", "D:/zip/tmp")
    if file_cnt > 0:
        # 按网点压缩打包文件
        zip_file_cnt = get_category_dir_zip("D:/zip/tmp", "D:/zip/data")
        print("拆分建立{}个zip文件。".format(zip_file_cnt))
    else:
        print("zip文件为空,未拆分建立zip文件。")

Python ZIP 装包 拆包

装包

zip函数可以将两个列表“缝合起来”,比如:

a=[1,2,3]
b=['x','y','z']
c=list(zip(a,b))
print(c)

这里的含义是a里面的第一个元素跟b里面的第一个元素配对,放到一个元组里面;a里面的第二个元素跟b里面的第二个元素配对,放到另外一个元组里面;以此类推。

现在,另外在a里面增加一个元素,再使用zip的结果会怎么样呢?

a.append(4)
c=list(zip(a,b))
print(c)

从上面截图可以看出,列表是作为参数被传入zip函数中,而zip函数在遍历列表(或者其他的可迭代数据类型 Iterable data type)时,遍历到最短的那个列表后,遍历结束。

在上面a和b的例子中,b列表长度是3,a列表长度是4,所以最终产生的列表c的长度也只有3。

拆包

拆包是装包的方向操作

d=list(zip(*c))
print(d)

上述拆包的核心是在zip(*c)里面,这里不是太好理解。从结果来看,是产生了两个元组,d和e。其分别的内容和a及b这两个列表元素一样。

这里重点看下*c,不太好理解。其实可以打印出来:

print(*c)

从上图可以看出 *c是把c列表里面的三个参数分别拆了出来,然后作为参数传入了zip函数里面。可以做另一个试验验证一下。

p1=(1,'x')
p2=(2,'y')
p3=(3,'z')
p=list(zip(p1,p2,p3))
p==d

从上面的验证可以看出拆包时候的*c,其实就c列表里面三个作为元组的元素分别传入zip函数中。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python如何拆分ZIP文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python如何实现破解zip文件

小编给大家分享一下Python如何实现破解zip文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、思路爆密码的思路其实都大同小异:无非就是字典爆破,就看你是有
2023-06-14

Java 如何实现按行拆分文件?(java按行拆分文件怎么实现)

在Java编程中,按行拆分文件是一个常见的需求,它可以用于处理大量文本数据、日志文件分析等场景。本文将介绍如何使用Java实现按行拆分文件的功能。一、准备工作在开始实现按行拆分文件之前,我们需要确保以下几点:
Java 如何实现按行拆分文件?(java按行拆分文件怎么实现)
Java2024-12-19

如何分析linux zip文件解压命令

如何分析linux zip文件解压命令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Linux命令千千万,就看你会不会用,Linux文件解压命令也有好几个,下面
2023-06-28

Python如何打开 ZIP 文件以供读取

使用Python的zipfile模块打开ZIP文件以供读取。ZipFile类用于打开文件,extract()方法提取单个文件,extract_to()方法指定提取目录。namelist()方法获取文件列表,getinfo()方法提供文件信息。也可以直接使用open()方法读取ZIP文件中的文件。
Python如何打开 ZIP 文件以供读取
2024-04-02

ubuntu如何解压zip文件

这篇文章主要讲解了“ubuntu如何解压zip文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ubuntu如何解压zip文件”吧!ubuntu解压zip文件的方法1、首先输入系统密码点击u
2022-12-30

Python如何破解加密zip文件的密码!

这位同学在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案。

Java如何解压zip文件

小编给大家分享一下Java如何解压zip文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:package com.lanyuan.assembly.ut
2023-05-30

如何在 Java 中读取 zip 文件?(java怎么读取zip文件)

在Java编程中,读取zip文件是一项常见的任务。Zip文件是一种常用的压缩文件格式,它可以将多个文件和目录打包成一个单独的文件,方便存储和传输。以下是在Java中读取zip文件的步骤:一、导入相关的Java类库
如何在 Java 中读取 zip 文件?(java怎么读取zip文件)
Java2024-12-21

怎么在python中拆分与合并文件

本篇文章给大家分享的是有关怎么在python中拆分与合并文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编译性、
2023-06-15

如何使用Python实现zip文件密码破解

小编给大家分享一下如何使用Python实现zip文件密码破解,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Python有一个内置模块zipfile可以干这个事情,测试一波,一个测试文件,设置解压密码为123。import
2023-06-15

如何在 Linux 中使用 split 命令拆分文本文件

让我们来探索如何在 Linux 中使用 split 命令来拆分文件。无论您需要从大文件中提取特定部分,还是将文件拆分为较小的块,split 命令都可以帮助您轻松实现目标。
Linux文件2024-11-30

Linux下如何解压zip文件

本篇内容主要讲解“Linux下如何解压zip文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下如何解压zip文件”吧!通常情况下,Linux系统并不会产生zip文件,而是由用户把zi
2023-06-27

Python打包文件夹(zip/tar/

Code tells all:一、zipimport os, zipfile#打包目录为zip文件(未压缩)def make_zip(source_dir, output_filename):    zipf = zipfile.ZipFi
2023-01-31

Linux系统如何解压zip文件

本篇文章为大家展示了Linux系统如何解压zip文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。zip是最流行也是最广泛的一种压缩方法,那么在Linux系统中如何解压呢?先决条件:检查你是否安装了
2023-06-28

JavaScript 如何在线解压 ZIP 文件?

相信大家对 ZIP 文件都不会陌生,当你要打开本地的 ZIP 文件时,你就需要先安装支持解压 ZIP 文件的解压软件。但如果预解压的 ZIP 文件在服务器上,我们应该如何处理呢?

如何在Linux中zip压缩文件和文件夹

这期内容当中小编将会给大家带来有关如何在Linux中zip压缩文件和文件夹,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。zip 是***的归档文件格式之一。使用 zip,你可以将多个文件压缩到一个文件中。
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录