在Windows上用Python连接gzip文件

在Windows上用Python连接gzip文件,python,gzip,concatenation,Python,Gzip,Concatenation,有没有一种内存有效的方法可以在Windows上使用Python连接gzip文件,而无需解压缩它们 根据对的评论,应该简单到: cat file1.gz file2.gz file3.gz > allfiles.gz 但是在Windows上如何使用Python实现这一点呢?只需继续写入同一个文件即可 with open(..., 'wb') as wfp: for fn in filenames: with open(fn, 'rb') as rfp: shutil

有没有一种内存有效的方法可以在Windows上使用Python连接gzip文件,而无需解压缩它们

根据对的评论,应该简单到:

cat file1.gz file2.gz file3.gz > allfiles.gz

但是在Windows上如何使用Python实现这一点呢?

只需继续写入同一个文件即可

with open(..., 'wb') as wfp:
  for fn in filenames:
    with open(fn, 'rb') as rfp:
      shutil.copyfileobj(rfp, wfp)

您不需要python将多个文件复制到一个文件中。您可以为此使用标准Windows“复制”:

copy file1.gz /b + file2.gz /b + file3.gz /b allfiles.gz
或者,简单地说:

copy *.gz /b allfiles.gz
但是,如果您希望使用Python,Ignacio的答案是一个更好的选择。

cat file1.gz file2.gz file3.gz > allfiles.gz
有效,那么这也应该有效:

fileList = ['file1.gz', 'file2.gz', 'file3.gz']
destFilename = 'allfiles.gz'

bufferSize = 8  # Adjust this according to how "memory efficient" you need the program to be.

with open(destFilename, 'wb') as destFile:
    for fileName in fileList:
        with open(fileName, 'rb') as sourceFile:
            chunk = True
            while chunk:
                chunk = sourceFile.read(bufferSize)
                destFile.write(chunk)

幸运的是,gzip文件可以通过
cat
CL命令直接连接,但不幸的是,似乎没有明显的python命令来实现这一点(无论如何,在标准库
gzip
中)。然而,我只是简单地看了看。可能有一些库可以实现这一点

尽管如此,使用标准库实现这一点的一种方法是使用
子流程调用
cat

from subprocess import check_call
command = "cat {} {} > {}".format(file1_path, file2_path, output_name)
check_call(command.split())  # Check call takes a list
要将其推广到任意数量的输入,可以执行以下操作:

inputs = ['input1', 'input2', ... 'input9001']
output_name = 'output.gz'

command = "".join(['cat ', '{} ' * len(inputs), '> {out}'])
_call_ = command.format(*inputs, out=output_name).split()

check_call(_call_)

我希望这对某人有帮助。

您忘记了
+
/b
s。您在
所有文件.gz
之前有一个无关的
+
,这将导致
文件1.gz
被覆盖。“如果忽略目标,则文件将合并并存储在列表中第一个文件的名称下。”您是对的。谢谢你对细节的关注。Than说,理解文件前后/b的含义真的很难理解..这会将输入文件截断到缓冲区的大小。哎呀,你是对的-忘记了while循环来编辑整个文件-谢谢。对于iter中的块,内部循环可以缩短为
(lambda:sourceFile.read(bufferSize),“”):destFile.write(块)
。此外,请记住,PEP 8建议使用带有下划线的名称\u,而不是camelCase。