在python中下载大文件错误:压缩文件在到达流结束标记之前结束



我正在从互联网下载一个压缩文件:

with lzma.open(urllib.request.urlopen(url)) as file:
    for line in file:
        ...

在下载并处理了大部分文件后,我最终得到了错误:

文件"/usr/lib/python3.4/lzma.py",第225行,在_fill_buffer raise中EOFError("压缩文件在"EOFError:压缩文件之前结束在流结束标记到达之前结束

我认为这可能是由于互联网连接中断或服务器在一段时间内没有响应造成的。如果是这样的话,有没有办法让它继续尝试,直到重新建立连接,而不是抛出异常。我不认为这是文件的问题,因为我已经从同一个网站手动下载了许多类似的文件,并对其进行了手动解压缩。我还能够使用Python下载和解压缩一些较小的文件。我试图下载的文件的压缩大小约为20 GB。

来自urlib.urlopen文档:

有一点需要注意:如果省略了size参数或否定,可能直到数据流结束才读取;没有确定套接字中的整个流在一般情况下阅读。

也许是因为以上原因,lzma.open在巨大的大小/连接错误/超时时跳闸。

这可能是liblzma错误。作为一种变通方法,尝试添加:

lzma._BUFFER_SIZE = 1023

在调用CCD_ 1之前。

您尝试过使用请求库吗?我相信它提供了一个对urllib的抽象。

下面的解决方案应该适用于您,但它使用请求库而不是urllib(但无论如何都是requests>urllib!)。如果您更喜欢继续使用urllib,请告诉我。

import os
import requests
def download(url, chunk_s=1024, fname=None):
    if not fname:
        fname = url.split('/')[-1]
    req = requests.get(url, stream=True)
    with open(fname, 'wb') as fh:
        for chunk in req.iter_content(chunk_size=chunk_s):
            if chunk:
                fh.write(chunk)
    return os.path.join(os.getcwd(), fname)

假设您需要下载一个大文件,最好使用"写和二进制";在python中将内容写入文件时的模式。

您也可以尝试使用python请求模块而不是urllib模块:

请参阅下面的工作代码:

import requests
url="http://www.google.com"
with open("myoutputfile.ext","wb") as f:
    f.write( requests.get(url).content )

你能测试一下这段代码吗?如果它不能解决你的问题,你可以回答。

向致以最良好的问候

相关内容

  • 没有找到相关文章

最新更新