4

我正在尝试使用 python 请求下载文件。它在 python 2.7 中工作,但现在不行。我真的很困惑,必须有一个更简单的答案。由于文件可能非常大,我真的想要一个进度条,我正在使用 python procressbar 来完成这项工作。

                r = requests.get(file_url, data={'track': 'requests'})
                size = int(r.headers['Content-Length'].strip())
                self.bytes = 0
                widgets = [name, ": ", Bar(marker="|", left="[", right=" "),
                    Percentage(), " ",  FileTransferSpeed(), "] ",
                    self,
                    " of {0}MB".format(round(size / 1024 / 1024, 2))]
                pbar = ProgressBar(widgets=widgets, maxval=size)
                pbar.start()

                file = b""
                for chunk in r.iter_content()
                    if chunk:
                        file += chunk

                        self.bytes += 1
                        pbar.update(self.bytes)

我发现使用 iter_content 是获得持续更新的最佳方式。我确实尝试过 iter_lines 但它弄乱了文件。它突然停止下载,非常慢,下载10%需要15分钟,然后停止。并且尝试以字节模式打开文件并写入它是行不通的,它根本不会引发错误。当我尝试打印块包含的内容时

print(chunk.decode("utf-8")

有效,但只有几个字符。在某些时候它抱怨

UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

即使在 iter_content 中使用“decode_unicode=True”也无济于事。我很困惑,不知道该怎么办。使用 Py3k 应该不难。

4

1 回答 1

4

设法修复它。所以这是更新的代码:

r = requests.get(file_url)
size = int(r.headers['Content-Length'].strip())
self.bytes = 0
widgets = [name, ": ", Bar(marker="|", left="[", right=" "),
    Percentage(), " ",  FileTransferSpeed(), "] ",
    self,
    " of {0}MB".format(str(round(size / 1024 / 1024, 2))[:4])]
pbar = ProgressBar(widgets=widgets, maxval=size).start()
file = []
for buf in r.iter_content(1024):
    if buf:
        file.append(buf)
        self.bytes += len(buf)
        pbar.update(self.bytes)
pbar.finish()

下载速度从 7kb/s 变为 400+ kb/s。它正在充分发挥作用。

于 2012-05-14T01:12:23.987 回答