簡體   English   中英

如何僅使用 Python 將 tar.gz 文件轉換為 zip?

[英]How to convert tar.gz file to zip using Python only?

有人有任何僅使用 Python 代碼將 tar.gz 文件轉換為 zip 的代碼嗎? 我在如何使用帶有 gzip 壓縮選項的 pandas read_csv 讀取 tar.gz 文件中提到了 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()甚至是先把每個tar文件成員的信息tarf.getmembers()和開放的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.')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM