【问题标题】:Split gzip file by file count按文件数拆分 gzip 文件
【发布时间】:2019-06-19 23:19:25
【问题描述】:

我有一个包含数百万个 xml 文件的大型 tar.gz 文件。

split linux 中的命令可以按字节数/行数进行拆分,但不能按文件数进行拆分。例如,我想将 gzip 文件拆分为每个输出子 gzip 中的 300k 个文件。是否有实用程序来实现这一点?

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

【问题讨论】:

  • Gzip 不跟踪文件边界。你确定不是.tar.gz
  • @Barmar 回答您的第一个问题:您是对的,它是.tar.gz。对于你的第二点 - 完全同意。然而,我已经实现了一个 Python 代码来解决这个问题。
  • 您应该更正问题以说出您的真正意思。
  • @Barmar 谢谢,我已经更新了

标签: python linux split tar gzip


【解决方案1】:

因为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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多