按文件数量分割gzip文件

时间:2019-06-19 23:19:25

标签: python linux split tar gz

我有一个很大的tar.gz文件,其中包含数百万个xml文件。

linux中的

split命令可以按位数/行进行拆分,但不能按个文件进行拆分。我想例如通过每个输出子gzip中的300k文件来分割gzip文件。有工具可以实现这一目标吗?

我的最终目标是在Python中处理tar.gz,我需要将文件拆分为较小的块,以保留文件。拆分将允许它们并行处理。

1 个答案:

答案 0 :(得分:0)

由于split不支持按文件计数拆分,因此我实现了Python实用程序:

import tarfile
import glob
import os
import shutil 

def make_a_split(input_dir, split_num):
    print("split {}".format(split_num))
    tar_output = tarfile.open("split_" + str(split_num) + ".tar.gz", "w:gz")
    for file_name in glob.glob(os.path.join(input_dir, "*")):
        #print("  Adding %s..." % file_name)
        tar_output.add(file_name, os.path.basename(file_name))
    tar_output.close()
    shutil.rmtree(tmp_output_dir)
    print("split {} done".format(split_num))

count_per_split = 300000
split = 1

tmp_output_dir = "tmp/"

tar = tarfile.open('your.tar.gz')

for idx, tarinfo in enumerate(tar):
    tar.extract(tarinfo, tmp_output_dir)
    if idx > 0 and idx % count_per_split == 0:
       make_a_split(tmp_output_dir, split)
       split += 1
tar.close()
# did we not remove the temp dir? It means we have seen less than count_per_split and need
# to make a split
if os.path.exists(tmp_output_dir):
   make_a_split(tmp_output_dir, split)