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

时间:2015-04-01 08:39:39

标签: python exception stream compression urllib

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

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

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

  

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

我认为这可能是因为互联网连接中断或服务器在一段时间内没有响应。如果是这种情况,那么无论如何都要让它继续尝试,直到重新建立连接,而不是抛出异常。 我不认为这是文件的问题,因为我手动从同一个网站手动下载了许多文件并解压缩。我也能用Python下载和解压缩一些较小的文件。我尝试下载的文件的压缩大小约为20 GB。

4 个答案:

答案 0 :(得分:2)

来自urllib.urlopen docs:

  

一个警告:read()方法,如果省略size参数或   否定,直到数据流结束才可能读取;没有   确定来自套接字的整个流的好方法   在一般情况下阅读。

由于上述原因,可能lzma.open因巨大的大小/连接错误/超时而跳闸。

答案 1 :(得分:2)

这可能是liblzma的错误。作为解决方法,请尝试添加:

lzma._BUFFER_SIZE = 1023

在致电lzma.open()之前。

答案 2 :(得分:2)

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

以下解决方案应该适合您,但它使用请求库而不是urllib(但请求> 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)

答案 3 :(得分:0)

假设你需要下载一个大文件,最好使用" write和binary"在python中将内容写入文件时的模式。

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

请参阅下面的工作代码:

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

如果它没有解决您的问题,您是否可以测试该段代码并回答。

祝你好运