是否有一种内存有效的方法可以在Windows上使用Python连接gzip压缩文件而无需解压缩?
根据对this answer的评论,它应该简单如下:
cat file1.gz file2.gz file3.gz > allfiles.gz
但是我如何在Windows上使用Python?
答案 0 :(得分:7)
继续写同一个文件。
with open(..., 'wb') as wfp:
for fn in filenames:
with open(fn, 'rb') as rfp:
shutil.copyfileobj(rfp, wfp)
答案 1 :(得分:1)
您不需要python将许多文件复制到一个文件。您可以使用标准Windows“复制”:
copy file1.gz /b + file2.gz /b + file3.gz /b + allfiles.gz
或者,简单地说:
copy *.gz /b allfiles.gz
但是,如果你想使用Python,Ignacio的答案是更好的选择。
答案 2 :(得分:0)
如果
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)
答案 3 :(得分:0)
幸运的是,gzip文件可以通过cat
CL命令直接连接,但不幸的是,似乎没有明显的python命令来执行此操作(在标准库gzip
中无论如何)。但是,我只是简单地看了一下。可能有图书馆可以实现这一目标。
尽管如此,使用标准库实现此目的的方法是使用cat
致电subprocess
:
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_)
我希望这对某人有帮助。