python ZipFile: output zip file,ByteIO
python,ZipFile,output,zip,file,ByteIO
2025-03-25 08:59:25 时间
python 3.9
zipFile出力
结论:
- 利用【zipfile】包
import io
import zipfile
- 直接写入指定文件中:
with zipfile.ZipFile(temp_path ,mode='w')as f:
f.write(file)
- 返回ByteIO
buffer = io.BytesIO()
# param1:写入对象 buffer
# param2:mode write
# param3:compression default'ZIP_STORED(no compression)
zip_file = zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED)
with zip_file:
# param1:zip file name
# param2:bytes file
zip_file.writestr(str_file_name, file.read())
return buffer
详细例
1,直接写入到文件中
import io
import urllib.parse
import zipfile
def write_file_to_zip(zip_name:str, files:List[str], md="w"):
"""
args:
zip_name: output zip file name
files : file path list, e.g.['C://temp//a.pdf','C://temp//b.pdf']
md : mode w:write, a:append 追加到既存的zip
"""
try:
# zip file path 指定,直接保存到指定的路径下
temp_path = os.path.join(settings.UPLOAD_FOLDER, zip_name)
with zipfile.ZipFile(temp_path ,mode=md) as f:
for file in files:
f.write(file)
#with 结束后,f.close()自动执行,文件保存完毕
# 若需要返回response-------------------------------------------start------------
# encode file name
quoted_filename = urllib.parse.quote(zip_name)
response = HttpResponse(open(temp_path, 'rb').read())
response['Content-Type'] = 'application/x-zip-compressed'
response['Content-Disposition'] = f"attachment; filename={quoted_filename}"
return response
# 若需要返回response-------------------------------------------end--------------
except Exception as e:
print("異常タイプ:%s"%type(e))
print("異常内容:%s"%e)
2,不保存文件,返回【BytesIO】
import io
import urllib.parse
import zipfile
def write_file_to_zip(files:List[object]):
"""zip output \n
return BytesIO without download
args:
files: [filename:str, file:BytesIO/BufferedReader]
"""
try:
buffer = io.BytesIO()
# param1:写入对象 buffer
# param2:mode write
# param3:compression default'ZIP_STORED(no compression)
zip_file = zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED)
with zip_file:
for file in files:
# param1:zip file name
# param2:bytes file
zip_file.writestr(file[0], file[1].read())
return buffer
↑ 调用
def test():
# 任意文件路径 例'C://temp//a.pdf'
file_path = os.path.join(settings.UPLOAD_FOLDER, 'folder', 'filename.pdf')
if os.path.exists(file_path):
f = open(file_path, 'rb')
# 调用
buffer = write_file_to_zip(['arcname.pdf', f])
#--直接写入文件---------------------------------------start-----------------
f = open('test.zip',"wb")
f.write(buffer.getbuffer()) # buffer.getvalue() 也可
f.close()
#--直接写入文件---------------------------------------end-------------------
#--返回前端----------------------------response------start-----------------
# レスポンスの設定
response = HttpResponse(buffer.getvalue())
response['Content-Type'] = 'application/x-zip-compressed'
# ダウンロードするファイル名
quoted_filename = urllib.parse.quote(filename)
response['Content-Disposition'] = f"attachment; filename={quoted_filename}"
return response
#--返回前端-----------------------------response------end-------------------
##Django利用(js参照)
//button click
$('#btn-dl').on("click", function(e){
e.preventDefault();
let url = '{% url "app:data_dl" %}'
let selected_rows = table.getSelectedRows();
let id_list = [];
selected_rows.forEach((el, idx, arr)=>{
id_list.push(el.id);
});
file_download(url, id_list);
});
function file_download(url, id){
let post_data = JSON.stringify({id});
let oReq = new XMLHttpRequest();
oReq.open("POST",url,true);
oReq.setRequestHeader("Content-Type", "application/json");
oReq.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
oReq.responseType = "blob";
oReq.onload = function(eEvent){
if (oReq.status == 200){
var disposition = oReq.getResponseHeader('Content-Disposition');
let download_name = disposition.split('filename=')[1];
let file_name = decodeURI(download_name);
let blob = oReq.response;
let link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = file_name;
link.click();
}else{
console.log("ファイルダウンロード失敗");
}
}
oReq.send(post_data);
}
相关文章
- 知乎高赞!有没有适合新手练习 Python 的做题类网站?
- 使用Python检测符号及乱码字符
- 记一次python清洗疫情历史数据
- 我用 Python 画了一盘粽子送给大家
- Python 一网打尽<排序算法>之从玩转冒泡排序开始
- 简单的Python脚本,实现ssh登录配置路由器
- Python 一网打尽<排序算法>之从希尔排序聊聊分治算法的哲学
- Python项目49-用户验证短信接口(可劲撸)
- 在树莓派中使用 MicroPython 接入 MQTT
- Python项目45-前后端分离Home主页及后台(开撸)
- Python-drf前戏38.2-前端Vue02
- Python 让我舅舅的书法作品和 PIL 库发生点美的误会
- Python一键生成国庆渐变头像
- Python继续霸榜,SQL写得溜,面试或许能加分
- python线性回归算法「建议收藏」
- 最强最炫的Python数据可视化神器,没有之一!
- Python 基础知识自检,你离深入掌握 Python 还有多远
- python怎么把字体调大_python修改字体
- Python中的语法糖甜不甜?
- Python基本数据类型-字符型