在Django中使用zipfile模块实现对上传的zip压缩包提取文件名

这篇具有很好参考价值的文章主要介绍了在Django中使用zipfile模块实现对上传的zip压缩包提取文件名。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

方法一:解压zip压缩包

思路一:获取带相对路径的文件名

思路二:只获取文件名(不带路径)

方法二:不解压压缩包(推荐)

思路一:获取带相对路径的文件名

思路二:只获取文件名(不带路径)

中文乱码的处理

方式一:解压压缩包(不带路径)

方式二:解压压缩包(带相对路径)


需要使用到zipfile标准模块

方法一:解压zip压缩包

思路一:获取带相对路径的文件名
import zipfile
import os


class UnZip(View):
    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取上传的zip压缩包

        # 方式二:思路一:将文件解压出来并遍历目录下的文件(带文件路径)
        extract_folder = zip_file.name.split('.')[0]  # 获取不带后缀名压缩包文件名
        zip_file = zipfile.ZipFile(zip_file)

        # 将文件解压到文件夹
        zip_file.extractall(path=extract_folder)
        zip_file.close()  # 关闭

        file_list = []
        
        # 遍历读取已解压的文件夹里的文件
        for root, dirs, files in os.walk(extract_folder + '/' + extract_folder + '/'):
            for file in files:
                # 因为解压出来的文件里会带自动带有一个desktop.ini文件,所以在这里获取时把这个文件给过滤掉
                if file == "desktop.ini":
                    continue
                # 这里使用.encode('cp437').decode('gbk')对file文件名进行中文名处理,否则中文会是乱码
                file_path = os.path.join(root, file.encode('cp437').decode('gbk'))
                file_list.append(file_path)
        return JsonResponse({"rest": file_list})
思路二:只获取文件名(不带路径)
import zipfile
import os


class UnZip(View):
    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取zip压缩包

        extract_folder = zip_file.name.split('.')[0]
        zip_file = zipfile.ZipFile(zip_file)

        # 将文件解压到zip文件夹
        zip_file.extractall(path=extract_folder)
        zip_file.close()

        # 方式二:思路二:将文件解压出来并遍历目录下的文件(不带文件路径,只有文件名)
        file_names = []
        for root, dirs, files in os.walk(extract_folder + '/' + extract_folder + '/'):
            for file in files:
                if file == "desktop.ini":
                    continue
                # 使用.encode('cp437').decode('gbk')对中文文件名进行处理
                file_name = os.path.basename(file.encode('cp437').decode('gbk'))
                file_names.append(file_name)
        return JsonResponse({"rest": file_names})  # 返回所有文件名

方法二:不解压压缩包(推荐)

思路一:获取带相对路径的文件名
import zipfile

class UnZip(View):
    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取zip压缩包

        # 方式一:不解压压缩包
        zip_names = []
        with zipfile.ZipFile(zip_file, 'r') as zipobj:
            # 思路一:带路径的
            for file_name in zipobj.namelist():
                # 对空文件名和自动生成的desktop.ini文件进行过滤
                if file_name.split('/')[-1] == '' or file_name.split('/')[-1] == "desktop.ini":
                    continue
                zip_names.append(file_name.encode('cp437').decode('gbk'))
    return JsonResponse({"res": zip_names})
思路二:只获取文件名(不带路径)
import zipfile


class UnZip(View):
    def compare_lists(self, list1, list2):
        """校对zip与excel数据是否匹配,输出不匹配和匹配的文件名"""
        set1 = set(list1)
        set2 = set(list2)

        different_elements = list(set1.symmetric_difference(set2))
        common_elements = list(set1.intersection(set2))

        diff_list1 = [element for element in different_elements if element in list1]
        diff_list2 = [element for element in different_elements if element in list2]

        return diff_list1, diff_list2, common_elements

    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取zip压缩包

        # 方式一:不解压压缩包
        zip_names = []
        with zipfile.ZipFile(zip_file, 'r') as zipobj:
            # 思路二:不带路径的
            for file_info in zipobj.infolist():
                file_name = file_info.filename.split('/')[-1]  # 获取不带路径的文件名
                # 对空文件名和自动生成的desktop.ini进去过滤处理
                if file_name == '' or file_name == 'desktop.ini':
                    continue
                else:
                    zip_names.append(file_name.encode('cp437').decode('gbk'))
        return JsonResponse({"res": zip_names})

中文乱码的处理

由于上面方法一中解压压缩包时遇到中文文件名时会出现文件名是乱码的问题,所以给出这个方法,方法参考:解决Python中ZipFile解压文件名中文乱码的问题_python解压zip文件出现乱码文件名_i止于至善的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-539117.html

方式一:解压压缩包(不带路径)
from zipfile import ZipFile
import os
class UnZip(View):
    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取zip压缩包

        def support_gbk(zip_file):
            """对中文文件名处理编码处理,防止乱码"""
            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

        extract_folder = zip_file.name.split('.')[0]

        # 将文件解压到zip文件夹
        with support_gbk(ZipFile(zip_file)) as zip_ref:
            zip_ref.extractall(path=extract_folder, pwd=None)


        # 方式二:思路二:将文件解压出来并遍历目录下的文件(不带文件路径,只有文件名)
        file_names = []
        for root, dirs, files in os.walk(extract_folder + '/' + extract_folder + '/'):
            for file in files:
                if file == "desktop.ini":
                    continue
                file_name = os.path.basename(file)
                file_names.append(file_name)
        return JsonResponse({"rest": file_names})  # 返回所有文件名
方式二:解压压缩包(带相对路径)
from zipfile import ZipFile
import os
class UnZip(View):
    def post(self, request):
        # 处理zip压缩包文件
        zip_file = request.FILES.get('file')  # 获取zip压缩包

        def support_gbk(zip_file):
            """对中文文件名处理编码处理,防止乱码"""
            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

        extract_folder = zip_file.name.split('.')[0]

        # 将文件解压到zip文件夹
        with support_gbk(ZipFile(zip_file)) as zip_ref:
            zip_ref.extractall(path=extract_folder, pwd=None)


        file_list = []

        for root, dirs, files in os.walk(extract_folder + '/' + extract_folder + '/'):
            for file in files:
                if file == "desktop.ini":
                    continue
                file_path = os.path.join(root, file)
                file_list.append(file_path)
        return JsonResponse({"rest": file_list})

到了这里,关于在Django中使用zipfile模块实现对上传的zip压缩包提取文件名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux使用解压命令unzip报错:unzip: cannot find zipfile directory in one of xxx.zip

    在linux服务器下使用rz上传压缩文件,用unzip命令解压zip包 报这种错误说明在文件上传或下载的过程中出现了文件丢失的情况,需要使用 sftp或scp重新上传文件到服务器 ,然后使用unzip命令或jar命令解压压缩文件

    2024年02月16日
    浏览(55)
  • 使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压

    目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 

    2024年02月07日
    浏览(53)
  • zip压缩包上传到了服务器怎么解压——提示unzip:command not found

    xshell进入压缩包所在的文件夹 如果你已经将zip压缩包上传到了服务器,可以使用以下命令解压缩: 其中,file.zip为你上传的zip压缩包的文件名。执行该命令后,zip压缩包中的所有文件将被解压到当前目录中。 如果你希望将解压后的文件解压到指定目录中,可以使用以下命令

    2023年04月09日
    浏览(48)
  • 已解决zipfile.BadZipFile: File is not a zip file

    已解决Python openpyxl 读取Excel文件,抛出异常zipfile.BadZipFile: File is not a zip file的正确解决,亲测有效!!! 一个小伙伴遇到问题跑来私信我,想用python读取Excel文件,但是发生了报错(当时他心里瞬间凉了一大截,跑来找我求助,然后顺利帮助他解决了,顺便记录一下希望可以

    2024年01月19日
    浏览(44)
  • 解压你的压缩:Python ZipFile 实战指南(一)ZipFile 类和它的参数们

    项目 描述 维基百科 ZIP 格式 Python 官方文档 zipfile - 使用ZIP存档 搜索引擎 Google 、 Bing Zip 文件格式规范 APPNOTE.TXT 项目 描述 Python 3.10.6 操作系统 Windows 10 专业版(x86-64) Zip 文件 ZIP 文件格式是一种数据压缩和文档储存的文件格式, 原名 Deflate,发明者为菲尔·卡茨(Phil Katz),

    2023年04月23日
    浏览(45)
  • java工具类 - 实现文件压缩zip及解压缩

    对hutool工具类进行的封装 解压缩 zipUtil是hutool包下的工具类 使用:

    2024年02月16日
    浏览(33)
  • Qt 实现压缩文件、文件夹和解压缩操作zip

    通过Qt自带的库来实现,使用多线程方式,通过信号和槽来触发压缩与解压缩,并将压缩和解压缩结果回传过来。 使用的类: 1、在.pro文件中添加模块gui-private 若未cmake工程,需要在CMakeList.txt中添加 待验证: 1、中文路径,文件名含有中文 2、隐藏文件夹,.dir和…dir,例如:

    2024年02月14日
    浏览(45)
  • Python学习第九篇:zipfile 库操作压缩包

    ​ —— 活动地址:CSDN21天学习挑战赛 zipfile是python里用来做zip格式编码的压缩和解压缩的 zipfile里有两个非常常用的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。 ZipFile是主要的类,用来创建和读取zip文件。 ZipInfo是存储的zip文件的每

    2023年04月22日
    浏览(40)
  • 使用python暴力破解zip压缩包的密码

    如果你有压缩包的密码忘记了,并且压缩包的加密算法采用的是ZipCrypto,并且压缩参数如下图所示: 那么你就可以使用本文中的方法进行破解。 压缩包的加密,是根据输入的密码进行运算加密,输入不同的密码,加密后的结果就是不同的二进制流。所以在进行解密的时候,

    2024年01月21日
    浏览(42)
  • Python实现rar、zip和7z文件的压缩和解压

    一、7z压缩文件的压缩和解压 1、安装py7zr 我们要先安装 py7zr 第三方库: 如果python环境有问题,执行上面那一条安装语句老是安装在默认的python环境的话,我们可以执行下面这条语句,将第三方库安装在项目的虚拟环境中: 2、解压7z文件 3、压缩成7z文件 二、rar压缩文件的压

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包