无意间想到的一个需求,然后就顺手写了写,留下来,方便以后用

列表版:(基本没用,仅提供思路,字典版稍微改动可以直接用)

  大体需求:

    把重复的文件名进行改名,达到浏览器下载相同文件的效果
    下载完成后再把文件夹和目录名删掉

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的写入文件流的方式

def test_zip(self):
import zipfile, tempfile, os
try:
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+组装文件夹的更多相关文章

  1. 【转】打包 压缩 命令tar zip

    https://www.cnblogs.com/centos2017/p/7896807.html tar语法 #压缩tar -czvf ***.tar.gztar -cjvf ***.tar.bz2 ...

  2. 打包 压缩 命令tar zip

    tar语法 #压缩tar -czvf ***.tar.gztar -cjvf ***.tar.bz2#解压缩tar -xzvf ***.tar.gztar -xjvf ***.tar.bz2 tar ...

  3. linux 学习笔记 显示压缩文件 gong.zip 的文件内容

    #zip -v gong zip zip info: xxx >删除压缩文件中俄smart.txt 文件 #zip -d gong.zip smart.txt deleting:smart.tx ...

  4. linux tar打包压缩排除某个目录或文件

    用tar打包时想剔除打包目录中的某个子目录或文件: 比如你想打包/home这个目录,但是/home/afish/目录和/home/www/afish.php文件你都不想打包,方法是: tar -zcv ...

  5. Linux常用命令2--用户问题、文件的打包压缩

    Linux常用命令 如何进行用户和群组的创建和更改 [1]groupadd:用于创建新的群组. 语法:groupadd [-option] 用户名:其常用参数有:-g groupadd -g 555 ...

  6. ICSharpCode.SharpZipLib工具压缩与解压缩zip文件

    using System; using System.Collections.Generic; using System.IO; using System.Text; using ICSharpCod ...

  7. webpack打包后不能调用,改用uglifyjs打包压缩

    背景: 项目基于原生js,没用到任何脚手架和框架,但也需要打包压缩. 项目的js中声明了一些全局变量 供其他js调用. 这时候如果用webpack打包,基于webpack特性,会嵌套一层大函数,会将j ...

  8. Python打包文件夹的方法小结(zip,tar,tar.gz等)

    本文实例讲述了Python打包文件夹的方法.分享给大家供大家参考,具体如下: 一.zip ? 1 2 3 4 5 6 7 8 9 10 11 import os, zipfile #打包目录为zip文 ...

  9. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

    文章转载自:https://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PH ...

随机推荐

  1. 关于IPFS的热门问题

      最近小编在公众号收到了一些提及比较高的问题,今天总结一下统一回答 目前网络上有一些对ipfs的解读五花八门,各式各样,有看好的,也有打击的,总之一项新技术诞生之初遇到的问题IPFS都遇到了. 问题 ...

  2. 设计模式 --> (16)观察者模式

    观察者模式 定义对象间的 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.它还有两个别名,依赖(Dependents),发布- 订阅(Publish-Sub ...

  3. python实现的txt目录树

    首先,我先表述一下我的需求: 我记笔记比较乱,但我比较容易"半途而废".文件夹很多,但大都只有一两个文件.... 所以我需要一种方式,能在不逐个打开文件夹的前提下,"看到 ...

  4. Java 小记 — RabbitMQ 的实践与思考

    前言 本篇随笔将汇总一些我对消息队列 RabbitMQ 的认识,顺便谈谈其在高并发和秒杀系统中的具体应用. 1. 预备示例 想了下,还是先抛出一个简单示例,随后再根据其具体应用场景进行扩展,我觉得这样 ...

  5. [转]C++ 初始化列表的初始化顺序

    构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序.成员被初始化的次序就是定义成员的次序.第一个被定义的成员先被初始化,依次类推.一般,初始化的顺序无关紧要,然而,如果一个成员是根据 ...

  6. Could not create pool connection. The DBMS driver exception was: null, message from server: "Host '192.168.XX.XX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

    早上打开浏览器准备登陆某个系统,发现Error 404--Not Found,有点奇怪,这个服务器应该没人用了才对,然后到weblogic后台去看日志,报如下错误: "Could not c ...

  7. 福州大学W班-助教总结

    开学初对自己的期望 在即将到来的学期前,我希望我可以做到以下几点: 1.多参与同学的课程设计,并提出自己的见解 2.不断提高个人的专业技能,活到老学到老 3.能够及时对同学的博客进行评论,并给出有用的 ...

  8. 第二次作业-Steam软件分析

    1 .介绍产品相关信息 随着电子音频游戏产业的发展以及正版意识的崛起,Steam已经成为大部分游戏爱好者必备的一款游戏下载平台.这款软件也使得Valve公司从一个游戏制作公司成功扩展业务到一个承揽众多 ...

  9. Beta No.7

    今天遇到的困难: 构造新适配器的时候出现了某些崩溃的问题 ListView监听器有部分的Bug 今天完成的任务: 陈甘霖:完成相机调用和图库功能,完成阿尔法项目遗留下来的位置调用问题,实现百度定位 蔡 ...

  10. 咸鱼翻身beta冲刺博客集

    咸鱼翻身beta冲刺博客集 凡事预则立-于Beta冲刺前 beta冲刺1-咸鱼 beta冲刺2-咸鱼 beta冲刺3-咸鱼 beta冲刺4-咸鱼 beta冲刺5-咸鱼 beta冲刺6-咸鱼 beta冲 ...