如何仅使用 Python 将 tar.gz 文件转换为 zip?
How to convert tar.gz file to zip using Python only?
是否有人有仅使用 Python 代码将 tar.gz 文件转换为 zip 的代码?如
中所述,我一直面临 tar.gz 的许多问题
您必须使用 tarfile 模块,模式为 'r|gz'
才能阅读。
然后用zipfile写
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 文件。
也许你也可以使用 shutil
,但我认为它不能在内存上工作。
PS:从我执行的简短测试来看,您可能对作为目录的成员 m
有问题。
如果是这样,您可能必须使用 is_dir()
,或者甚至首先使用 tarf.getmembers()
获取每个 tar 文件成员的信息,然后打开 tar.gz
文件以传输到 zip
,因为你不能在 tarf.getmembers()
之后做(你不能向后查找)。
这只是修复了上述答案中的几个小问题,确保保留 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.')
是否有人有仅使用 Python 代码将 tar.gz 文件转换为 zip 的代码?如
您必须使用 tarfile 模块,模式为 'r|gz'
才能阅读。
然后用zipfile写
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 文件。
也许你也可以使用 shutil
,但我认为它不能在内存上工作。
PS:从我执行的简短测试来看,您可能对作为目录的成员 m
有问题。
如果是这样,您可能必须使用 is_dir()
,或者甚至首先使用 tarf.getmembers()
获取每个 tar 文件成员的信息,然后打开 tar.gz
文件以传输到 zip
,因为你不能在 tarf.getmembers()
之后做(你不能向后查找)。
这只是修复了上述答案中的几个小问题,确保保留 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.')