查看原文
其他

给女朋友的儿童节礼物准备好了吗?python准备好了

猿媛牧场 Python专栏 2018-10-28




现在谈个恋爱、结个婚是真的炸啊。你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个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。


推荐阅读:
无所不能的Python,这次把手机APP也攻占了
《猿媛牧场》免费送你3本书,还不快来领?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存