Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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
如何解压缩.gz文件并将解压缩后的文件保存到Python中的其他目录?_Python_Subprocess_Gzip - Fatal编程技术网

如何解压缩.gz文件并将解压缩后的文件保存到Python中的其他目录?

如何解压缩.gz文件并将解压缩后的文件保存到Python中的其他目录?,python,subprocess,gzip,Python,Subprocess,Gzip,我有一个70GB的.gz文件,我正试图解压并保存到另一个目录,到目前为止没有成功 以下是我尝试过的一些事情: import gzip f = gzip.open('/directory1/file.txt.gz', 'rb') decompressed_file = gzip.GzipFile(fileobj=f) with open('/directory2/file.txt', 'wb') as s: s.write(decompressed_file.read()) s.clos

我有一个70GB的.gz文件,我正试图解压并保存到另一个目录,到目前为止没有成功

以下是我尝试过的一些事情:

import gzip

f = gzip.open('/directory1/file.txt.gz', 'rb')

decompressed_file = gzip.GzipFile(fileobj=f)

with open('/directory2/file.txt', 'wb') as s:
 s.write(decompressed_file.read())
 s.close
当我运行上述命令时,会创建“/directory2/file.txt”,但该文件为空,并且终端会终止进程

import subprocess

subprocess.run(['zcat', '/directory1/file.txt.gz', '>', '/directory2/file.txt'])
这个zcat命令在终端中执行时运行得非常好,但在Python中运行时,我正在解压缩的文件的全部内容都会打印到控制台。这显然大大减慢了减压速度。我正在运行这些命令的远程服务器有一个时间限制,它将在进程完成之前结束进程

subprocess.run(['zcat', '/directory1/file.txt.gz', '>', '/directory2/file.txt'], stdout = subprocess.PIPE)
当我运行上述操作时,我得到以下错误:

File "/usr/lib64/python3.6/subprocess.py", line 425, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
File "/usr/lib64/python3.6/subprocess.py", line 850, in communicate
    stdout = self.stdout.read()
OSError: [Errno 14] Bad address

我做错了什么,或者完成我试图做的事情的正确方式是什么?解压一个.gz文件并将其保存到另一个目录的感觉应该很简单,但到目前为止,我运气不好。

由于您试图将整个存档加载到内存中,所以该过程似乎会终止。观察内存使用情况以确认这一点

因为构造类似于文件的对象,所以可能需要运行它。让我们为它创建函数:

导入gzip
进口舒蒂尔
缓冲区大小=200*1024*1024#200 mb,任意
def gunzip(源、目标、缓冲区大小=缓冲区大小):
使用gzip.open(source)作为s:
打开(目的地“wb”)作为d:
shutil.copyfileobj(s、d、缓冲区大小)
并使用它:

gunzip(“/directory1/file.txt.gz”,“/directory2/file.txt”)

您可以尝试几项更改:

  • 在子流程中,使用“gunzip”Unix命令而不是“zcat”
  • 将“gunzip”命令放在shell脚本文件中,例如bashshell。subprocess.call()直接调用脚本文件,而不是命令。如果需要执行其他操作系统级操作(如文件复制或移动到不同的位置等),这可能会有所帮助。请确保使用命令行上的“chmod”将shell脚本文件设置为可执行文件
  • 祝你好运。

    “读取”可以接受大小参数。您需要一个循环来读取文件的合理部分,写入它,然后重复。当“read”返回空字节对象时停止循环。