4

Pythonリクエストを使用してファイルをダウンロードしようとしています。Python 2.7で動作しましたが、現在は動作しません。私は本当に混乱していて、もっと簡単な答えがなければなりません。ファイルは非常に大きくなる可能性があるため、プログレスバーが本当に必要です。Pythonprocressbarを使用して作業を行っています。

                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 に答える