python压缩文件夹为zip_python打包压缩文件夹zip+组装文件夹
無意間想到的一個需求,然后就順手寫了寫,留下來,方便以后用
列表版:(基本沒用,僅提供思路,字典版稍微改動可以直接用)
大體需求:
把重復的文件名進行改名,達到瀏覽器下載相同文件的效果
下載完成后再把文件夾和目錄名刪掉
import os
import zipfile
import shutil
import re
def make_zip(source_dir, output_filename):
zipf = zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED)
pre_len = len(os.path.dirname(source_dir))
for parent, dirnames, filenames in os.walk(source_dir):
for filename in filenames:
pathfile = os.path.join(parent, filename)
arcname = pathfile[pre_len:].strip(os.path.sep) # 相對路徑
zipf.write(pathfile, arcname)
zipf.close()
dir_name = "files"
os.makedirs(dir_name)
file_names = ["文件1","文件2","文件1","文件1","文件1","wenjian1"]
file_names_sorted = sorted(file_names)
file_new_names = []
prog = re.compile(r".*\((\d+)\)$")
for file_name in file_names_sorted:
if file_name in file_new_names:
if prog.match(file_new_names[-1]):
file_name = file_name + "(%s)" % (int(prog.match(file_new_names[-1]).group(1))+1)
else:
file_name = file_name + "(1)"
file_new_names.append(file_name)
for file_new_name in file_new_names:
file_path = os.path.join(dir_name, file_new_name)
with open(file_path+'.py', mode="w", encoding="utf-8")as f:
f.write("print('hello world!')")
shutil.rmtree("files")
os.remove("files")
字典版:
關鍵問題:tornado提供下載,對重復的文件名進行重命名(和瀏覽器類似)
import os
import zipfile
import shutil
import re
import tornado.web
class FileDownLoadHandler(tornado.web.RequestHandler):
def post(self, *args, **kwargs):
def make_zip(source_dir, output_filename):
zipf = zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED)
pre_len = len(os.path.dirname(source_dir))
for parent, dirnames, filenames in os.walk(source_dir):
for filename in filenames:
pathfile = os.path.join(parent, filename)
arcname = pathfile[pre_len:].strip(os.path.sep) # 相對路徑
zipf.write(pathfile, arcname)
zipf.close()
# dir_name和file_infos都應該從數據庫取
dir_name = "新建文件夾"
os.makedirs(dir_name)
file_infos = [{'file_content': 'print("Hello World!")', 'file_name': '文件1'},
{'file_content': 'print("Hello World!")', 'file_name': '文件2'},
{'file_content': 'print("Hello World!")', 'file_name': '文件1'}]
print(file_infos)
file_infos_sorted = sorted(file_infos, key=lambda item: item["file_name"])
prog = re.compile(r".*\((\d+)\)$")
print(file_infos_sorted)
file_new_infos = []
file_names_set = set()
for file_info in file_infos_sorted:
if file_info["file_name"] in file_names_set:
if prog.match(file_new_infos[-1]["file_name"]):
file_info["file_name"] = file_info["file_name"] + "(%s)" % (
int(prog.match(file_new_infos[-1]["file_name"]).group(1)) + 1)
else:
file_info["file_name"] = file_info["file_name"] + "(1)"
else:
file_names_set.add(file_info["file_name"])
file_new_infos.append(file_info)
for file_new_info in file_new_infos:
file_path = os.path.join(dir_name, file_new_info["file_name"])
with open(file_path + ".py", mode="w", encoding="utf-8")as f:
f.write(file_new_info["file_content"])
target_name = dir_name + ".zip"
make_zip(dir_name, target_name) # 打包加壓縮
# 下載
self.set_header('Content-Type', 'application/octet-stream')
self.set_header('Content-Disposition', ('attachment; filename=%s' % target_name).encode("utf-8"))
buf_size = 4096
with open(target_name, "rb")as f:
while True:
data = f.read(buf_size)
if not data:
break
self.write(data)
self.finish()
shutil.rmtree(dir_name)
os.remove(target_name)
才發現自己是真的菜,無意間問了一個java的同事,他們說Java可以直接寫如zip流,然后找到了python的寫入文件流的方式
deftest_zip(self):importzipfile, tempfile, ostry:
file_name= tempfile.mktemp(suffix=".zip") #mktemp方法慎用
with zipfile.ZipFile(file_name, 'w', zipfile.ZIP_DEFLATED) as zf:for i in range(5):
zf.writestr("文件名%s" % i, """print('文件內容')""")#這里接著就是下載邏輯了,和上面的一樣,就不重復寫了
finally:
os.remove(file_name)
總結
以上是生活随笔為你收集整理的python压缩文件夹为zip_python打包压缩文件夹zip+组装文件夹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当前记录集不支持更新_不断中招的你还放心
- 下一篇: statuml怎么添加用户_UML课后习