Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
同时读取和提取tar文件,可能使用python和/或bash_Python_Bash_Download_Tar - Fatal编程技术网

同时读取和提取tar文件,可能使用python和/或bash

同时读取和提取tar文件,可能使用python和/或bash,python,bash,download,tar,Python,Bash,Download,Tar,web上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在子共享文件中)和一些文本文件。我需要所有的图像,但只有在一个较低的分辨率,我还需要文本文件。但是我没有足够的空间来下载整个东西。此外,大型tar文件还支持下载简历 所以我想做一个脚本,只下载文件的一部分,提取包含的文件并处理它。然后做下一部分,依此类推。也许python应该是最简单的方法,不是吗?或者是bash脚本?我如何做到这一点?我自己的部分答案,以便启动想法,不幸的是,我似乎对python或bash不够精通,

web上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在子共享文件中)和一些文本文件。我需要所有的图像,但只有在一个较低的分辨率,我还需要文本文件。但是我没有足够的空间来下载整个东西。此外,大型tar文件还支持下载简历


所以我想做一个脚本,只下载文件的一部分,提取包含的文件并处理它。然后做下一部分,依此类推。也许python应该是最简单的方法,不是吗?或者是bash脚本?我如何做到这一点?

我自己的部分答案,以便启动想法,不幸的是,我似乎对python或bash不够精通,不知道最优雅、最直接的方法,但我发现:

Python具有以下模块: ,

还有一个文件正在恢复下载脚本:

但我不知道如何把它们粘在一起

我还可以使用bash同时下载和卸载tar,但是我如何递归地完成这项工作(记住,我们可能需要进入其他tar文件,或者我们必须相应地处理文本文件),这也是可以恢复的吗?

一个想法是使用bash和python的弗兰肯斯坦。也就是说,使用curl和untar分别获取文件,然后将文件传递给我自己的脚本进行处理,然后我可以在脚本中进行所有检查:

curl http://wordpress.org/latest.tar.gz | tar xz | python myScript
curl可以支持恢复:


但接下来我们会遇到一个问题:焦油是可回收的吗

您可以在python中实现这一点,但这并不简单。一点也不

您可以使用并提供
fileobj
参数

从技术上讲,你可以直接从中提供一些东西。主要的问题是,由于您正在处理超过1 TB的数据,因此传输将失败

正如您所说,您需要按需重试传输。最好的方法是创建一个类似文件的对象,该对象可以弹性地读取URL,处理断开连接和超时。 显然,你不需要重新发明轮子


另一个问题是(正常)
tar
文件没有索引。如果不先处理整个
tar
文件,就无法真正列出其中的文件,因此需要在文件出现时提取它们。似乎没有一种内置的方法可以做到这一点,并在提取每个文件(即回调)后重新获得流控制,因此您必须自己编写。查看
TarFile.extractall
的源代码,看看它是如何完成的(
print inspect.getsource(TarFile.TarFile.extractall)

bash是一个好主意,可以为您节省大量实现复杂性
wget
可能会自动重试:
wget设计用于在缓慢或不稳定的网络连接上保持健壮性;如果由于网络问题导致下载失败,它将继续重试,直到检索到整个文件。如果服务器支持regetting,它将指示服务器从其停止的位置继续下载。
(续)正如您所说,主要问题是知道何时处理其中的文件。如果您在linux上,您可以使用
inotify
在新文件出现时收到通知,并相应地处理它们。此外,请选中
curl
@goncalopp上的
--retry
选项,wget方法将写入文件。所以我仍然需要大硬盘。curl不支持resume,是吗?你可以使用
-O-
检查
wget
写入
stdout
,我正在考虑这个问题。它似乎比管道tar方法干净得多。我已经锁定了extractAll代码,这似乎是“最简单”的方法,所以我将接受它作为答案。