网络上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在子文件中)和一些文本文件。我需要所有的图像,但只有较低的分辨率,我也需要文本文件。但是我没有足够的空间来下载整个内容。此外,大型tar文件还支持下载恢复。
所以我想做一个只下载文件的一部分的脚本,提取包含的文件并进行处理。然后做下一部分,依此类推。可能python应该是最简单的方法,不是吗?或者也许是一个bash脚本?我怎么能这样做?
答案 0 :(得分:0)
我自己的部分答案,以便开始创意,不幸的是,似乎我不够精通python或bash来了解最优雅和直接的方式,但这里是我发现的:
Python有这个tar模块: https://docs.python.org/3/library/tarfile.html,
还有这个文件恢复下载脚本: http://code.activestate.com/recipes/83208-resuming-download-of-a-file/
但我不知道如何将它们粘在一起。
我也可以使用bash同时下载和解压缩,但是我怎么能递归地执行此操作(请记住可能还有其他我们需要进入的tar文件或我们必须相应处理的文本文件),这可以恢复吗? http://www.howtogeek.com/howto/uncategorized/linux-quicktip-downloading-and-un-tarring-in-one-step/
一个想法是使用bash和python的Frankenstein。这是使用curl和untar单独获取文件,然后将文件传递给我自己的脚本进行处理,然后我可以在脚本中进行所有检查:
curl http://wordpress.org/latest.tar.gz | tar xz | python myScript
curl可以支持简历: http://www.cyberciti.biz/faq/curl-command-resume-broken-download/
但是接下来我们遇到的问题是:是否可以重新使用!
答案 1 :(得分:0)
你可以在python中做到这一点,但这并不简单。完全没有。
您可以使用tarfile.open
并提供fileobj
参数。
从技术上讲,可以直接从urllib.urlopen
提供。主要问题是,由于您正在处理超过1 TB的数据,因此传输将失败。
正如您所说,您需要根据需要重试转移。您最好的办法是制作一个类似文件的对象,从URL中弹性读取,处理断开连接和超时。
显然,urllib3
will do this automatically,所以你不需要重新发明轮子。
另一个问题是(普通)tar
文件没有索引。你不能真正列出里面的文件而不先处理整个tar
- 所以你需要在它们出现时提取它们。似乎没有内置的方法来执行此操作和在每个文件被提取后重新获得流量控制(即:回调),因此您必须自己编写它。查看TarFile.extractall
的源代码,看看它是如何完成的(print inspect.getsource(tarfile.TarFile.extractall)
)