如何使用Python将tar.gz文件转换为zip?

时间:2016-09-01 07:48:50

标签: python zip tar

是否有人使用Python代码将tar.gz文件转换为zip的代码?我在How can I read tar.gz file using pandas read_csv with gzip compression option?

中提到了tar.gz面临的许多问题

2 个答案:

答案 0 :(得分:3)

您必须使用模式'r|gz'的{​​{3}}模块进行阅读。 然后使用tarfile进行写作。

import tarfile, zipfile
tarf = tarfile.open( name='mytar.tar.gz', mode='r|gz' )
zipf = zipfile.ZipFile( file='myzip.zip', mode='a', compression=zipfile.ZIP_DEFLATED )
for m in tarf:
    f = tarf.extractfile( m )
    fl = f.read()
    fn = m.name
    zipf.writestr( fn, fl )
tarf.close()
zipf.close()

您可以使用is_tarfile()检查有效的tar文件。

也许你也可以使用zipfile,但我认为它不能用于记忆。

PS:从我执行的简短测试中,您可能会遇到成员m这些目录的问题。 如果是这样,您可能必须使用is_dir(),或者首先使用tarf.getmembers()获取每个tar文件成员的信息,然后打开tar.gz文件以转移到zip ,因为你不能在tarf.getmembers()之后做到(你不能向后寻找)。

答案 1 :(得分:0)

这只是修复了上述答案中的几个小问题,确保保留 mtime 并确保对所有文件进行压缩。简单的答案都归功于上面的所有内容。

from datetime import datetime
import sys
from tarfile import open
from zipfile import ZipFile, ZIP_DEFLATED, ZipInfo

compresslevel = 9
compression = ZIP_DEFLATED

with open(name=sys.argv[1], mode='r|gz') as tarf:
    with ZipFile(file=sys.argv[2], mode='w', compression=compression, compresslevel=compresslevel) as zipf:
        for m in tarf:
            mtime = datetime.fromtimestamp(m.mtime)
            print(f'{mtime} - {m.name}')
            zinfo: ZipInfo = ZipInfo(
                filename=m.name,
                date_time=(mtime.year, mtime.month, mtime.day, mtime.hour, mtime.minute, mtime.second)
            )
            if not m.isfile():
                # for directories and other types
                continue
            f = tarf.extractfile(m)
            fl = f.read()
            zipf.writestr(zinfo, fl, compress_type=compression, compresslevel=compresslevel)

print('done.')