Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按文件计数拆分gzip文件_Python_Linux_Split_Tar_Gzip - Fatal编程技术网

Python 按文件计数拆分gzip文件

Python 按文件计数拆分gzip文件,python,linux,split,tar,gzip,Python,Linux,Split,Tar,Gzip,我有一个很大的tar.gz文件,其中包含数百万个xml文件 split命令在linux中可以按比特数/行数拆分,但不能按文件数拆分。例如,我想将gzip文件拆分为每个输出子gzip中的300k个文件。是否有一个实用程序来实现这一点 我的最终目标是用Python处理tar.gz,我需要将文件分割成更小的块来保存文件。拆分将允许并行处理它们。因为split不支持按文件数拆分,所以我实现了一个Python实用程序: import tarfile import glob import os import

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

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


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

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

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