【发布时间】:2019-01-02 15:08:40
【问题描述】:
我有以下问题:我正在编写一个函数来查找一堆 .gz 文件,解压缩它们,并将单独的未压缩文件存储在更大的 .tar.gz 存档中。到目前为止,我设法使用以下代码实现它,但手动计算未压缩文件大小并设置 TarInfo 大小似乎相当hackish,我想知道是否有更惯用的解决方案来解决我的问题:
import gzip
import os
import pathlib
import tarfile
def gather_compressed_files(input_dir: pathlib.Path, output_file: str):
with tarfile.open(output_file, 'w:gz') as tar:
for input_file in input_dir.glob('*.gz'):
with gzip.open(input_file) as fd:
tar_info = tarfile.TarInfo(input_file.stem)
tar_info.size = fd.seek(0, os.SEEK_END)
fd.seek(0, os.SEEK_SET)
tar.addfile(tar_info, fd)
我尝试通过以下方式创建TarInfo 对象,而不是手动创建它:
tar_info = tar.gettarinfo(arcname=input_file.stem, fileobj=fd)
然而,这个函数检索我们以fd打开的原始.gz文件的路径来计算它的大小,因此只提供一个tar_info.size参数对应于压缩的.gz数据而不是未压缩的数据,这不是我想要的。根本不设置tar_fino.size 参数也不起作用,因为addfile 在传递文件描述符时使用所述大小。
有没有更好、更惯用的方法来实现这一点,还是我坚持目前的解决方案?
【问题讨论】:
-
你能举个例子来说明你的尝试吗?所有这些
tar.gz文件是否都存储在一个目录中?是否要将所有这些文件合并到一个tar.gz文件中?我只是在验证,所以我正确理解了您的问题。 -
我有一个包含
.gz文件的目录,我尝试将这些文件单独未压缩地存储在.tar.gz文件中。
标签: python python-3.x gzip tarfile