功能
根据附件地址去下载附件,然后打包zip,返回打包文件名
主要利用request和zip模块
实现
1.根据附件url地址request去下载到本地
try:
res = requests.get(data[0], stream=True, timeout=10, headers=headers)
with open(file, "wb") as fd:
for chunk in res.iter_content(chunk_size=1024):
fd.write(chunk)
except Exception:
print("保存附件失败:", str(data), file)
print(traceback.format_exc())
if logger:
logger.error("保存附件失败: %s", traceback.format_exc())
2.zipfile模块打包下载文件
zipfile_name = folder + '.zip' # 压缩包和文件夹同名
with ZipFile(zipfile_name, 'w') as zfile: # 以写入模式创建压缩包
for foldername, subfolders, files in os.walk(folder): # 遍历文件夹
# zfile.write(foldername)
for i in files:
zfile.write(os.path.join(foldername, i), i)
return zipfile_name
具体代码
import os
import shutil
import traceback
import requests
from zipfile import ZipFile
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}
# 打包目录为zip文件(未压缩)
def make_zip(folder):
zipfile_name = folder + '.zip' # 压缩包和文件夹同名
with ZipFile(zipfile_name, 'w') as zfile: # 以写入模式创建压缩包
for foldername, subfolders, files in os.walk(folder): # 遍历文件夹
# zfile.write(foldername)
for i in files:
zfile.write(os.path.join(foldername, i), i)
return zipfile_name
def get_file(dir, data):
name = data[1]
if not name:
array = data[0].split("/")
name = array[-1]
if name.find(".") == -1:
array = data[0].split(".")
name += "." + array[-1]
file = dir + name
return file
def zip_attachment(path, attachments, logger=None):
if len(attachments) == 0:
return ""
# download file
dir = path + "/"
if not os.path.exists(dir):
os.mkdir(dir)
for data in attachments:
file = get_file(dir, data)
try:
res = requests.get(data[0], stream=True, timeout=10, headers=headers)
with open(file, "wb") as fd:
for chunk in res.iter_content(chunk_size=1024):
fd.write(chunk)
except Exception:
print("保存附件失败:", str(data), file)
print(traceback.format_exc())
if logger:
logger.error("保存附件失败: %s", traceback.format_exc())
# zip directory
zipFile = make_zip(path)
# remove file
shutil.rmtree(path)
return zipFile.split("/")[-1]
调用
# 附件存路径
path = "D:/data/"
# 附件url列表
attachments = ['http://www.xxx.com/ahdad/asdas.doc']
zip_attachment(path, attachments)