其他
给女朋友的儿童节礼物准备好了吗?python准备好了
现在谈个恋爱、结个婚是真的炸啊。你2.14要送礼物,我认了,必须送啊,没有理由不送啊;3.14白色情人节,说好的女方还礼呢?我老婆送我包纸巾?5.1劳动节,她最光荣。这不,今天就儿童节了,礼物呢?(刚过的3.8妇女节这就忘了?)
行啊,咱们程序猿,特别是pythoner,不得好好准备下?今儿个,礼物已经打包完毕了,请自行拆开。
tar2zip.py
import tarfile, zipfile, glob, os, time
from io import BytesIO
def getuser():
# 模拟返回用户名、用户id
return "Miracle", 666
def 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个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。