目录
方法一:解压zip压缩包
思路一:获取带相对路径的文件名
思路二:只获取文件名(不带路径)
方法二:不解压压缩包(推荐)
思路一:获取带相对路径的文件名
思路二:只获取文件名(不带路径)
中文乱码的处理
方式一:解压压缩包(不带路径)
方式二:解压压缩包(带相对路径)
需要使用到zipfile标准模块文章来源:https://www.toymoban.com/news/detail-539117.html
方法一:解压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模板网!