现在谈个恋爱、结个婚是真的炸啊。你2.14要送礼物,我认了,必须送啊,没有理由不送啊;3.14白色情人节,说好的女方还礼呢?我老婆送我包纸巾?5.1劳动节,她最光荣。这不,今天就儿童节了,礼物呢?(刚过的3.8妇女节这就忘了?)
行啊,咱们程序猿,特别是pythoner,不得好好准备下?今儿个,礼物已经打包完毕了,请自行拆开。
tar2zip.py
import tarfile, zipfile, glob, os, timefrom io import BytesIOdef getuser(): # 模拟返回用户名、用户id return "Miracle", 666def getmode(name, data): # 返回文件类型,"b" 或 "t" # 假设我们现在都是字符,没有二进制文件 return "t"now = time.time()user = getuser()def fixup(infile): file, ext = os.path.splitext(infile) outfile = file + ".tar.gz" print(f'outfile: {outfile}') zip = zipfile.ZipFile(infile, "r") # 使用读模式打开zip压缩包 tar = tarfile.open(outfile, "w:gz") # 使用gzip、写 模式打开 tar.posix = 1 # 遍历zip包里面的内容 for name in zip.namelist(): if name.endswith("/"): continue data = zip.read(name) if getmode(name, data) == "t": # py3中zip读出来的是二进制,需要解码,bytes不能replace data = data.decode().replace("\r\n", "\n") # 添加一些tar包属性 tarinfo = tarfile.TarInfo() tarinfo.name = name tarinfo.size = len(data) tarinfo.mtime = now tarinfo.uname = tarinfo.gname = user[0] tarinfo.uid = tarinfo.gid = user[1] # 加入文件的时候,第二个参数fileobj必须是二进制,所以用BytesIO tar.addfile(tarinfo, BytesIO(data.encode())) tar.close() zip.close()if __name__ == '__main__': # 将当前目录下的所有文件夹都遍历一遍 for file in glob.glob("*.zip"): fixup(file)
结果截图
其实到这你们已经发现了,这其实是一个平时工作中会经常用到的小工具,特别是运维er,每天都有数不完的拆包、压包。
有了它,再也不用敲命令了,当然还有很多改进的地方,比如:文件夹、图片等其他资源的操作。好了,今天的python小技巧就分享到这了,希望能够带给你一些帮助。如果你喜欢的话,何不点个赞呢?如果喜欢的爱不释手,何不赞赏一个呢?
目前我开了2个主群,我邀请了一些我的BAT伙伴前来助阵。定期也会在群里组织抽奖、送书等活动。更有各种资源分享。
目前2个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。
文章有问题?点此查看未经处理的缓存