Django の zipfile モジュールを使用して、アップロードされた zip アーカイブからファイル名を抽出します。

目次

方法 1: zip アーカイブを解凍する

アイデア 1: 相対パスでファイル名を取得する

アイデア 2: ファイル名のみを取得する (パスなし)

方法 2: 圧縮パッケージを解凍しない (推奨)

アイデア 1: 相対パスでファイル名を取得する

アイデア 2: ファイル名のみを取得する (パスなし)

中国語文字化けの処理

方法 1: 圧縮パッケージを解凍します (パスなし)

方法 2: 圧縮パッケージを解凍する (相対パスを使用)


zipfile標準モジュールを使用する必要がある

方法 1: zip アーカイブを解凍する

アイデア 1: 相対パスでファイル名を取得する
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})
アイデア 2: ファイル名のみを取得する (パスなし)
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})  # 返回所有文件名

方法 2: 圧縮パッケージを解凍しない (推奨)

アイデア 1: 相対パスでファイル名を取得する
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})
アイデア 2: ファイル名のみを取得する (パスなし)
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})

中国語文字化けの処理

上記の方法1で圧縮パッケージを解凍するとファイル名が文字化けしてしまうため、この方法を記載しています 方法参考:Python_python解凍zipファイルのZipFile解凍ファイル名の中国語文字化け問題を解決するファイル名が文字化けしていると表示される

方法 1: 圧縮パッケージを解凍します (パスなし)
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})  # 返回所有文件名
方法 2: 圧縮パッケージを解凍する (相対パスを使用)
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})

おすすめ

転載: blog.csdn.net/qq_37140721/article/details/131589999