一覧に戻る

Pythonのファイルダウンロードにはurlretrieveではなくurlopenを使うべき理由

#Python#ダウンロード#urllib

結論

urlopenを使いましょう。urlretrieveはダウンロード開始時にファイルが生成されるため、ダウンロードが失敗・中断した場合不完全なファイルが残ってしまいます。

概要

Pythonでファイルをダウンロードする際、最も記述がシンプルなのはurlretrieveです。

import urllib

urllib.request.urlretrieve(download_url, save_dir)

urlretrieveはdeprecatedのようです。同じ事をするならurlopenが推奨されているよう。 しかしurlopenは以下のとおり若干ですが記述が煩雑なので、問題がないならurlretrieveを使いたい訳です。

import urllib
data = urllib.request.urlopen(download_url).read()
with open(save_dir, mode="wb") as f:
    f.write(data)

urlopen VS urlretrieve

urlopenはtimeoutオプションが使えるという利点はありますがそれは些細なことです。urlretrieveを使うべきではない大きな理由があります。以下のとおりです。

  • urlretireveはダウンロード開始時にファイルを作成します。
  • urlopenはダウンロード完了後にファイルを作成します。

urlretireveはダウンロードの成否関係なく先にファイルを生成します。作成されたファイルにデータを随時書き込んでいくイメージです。つまりダウンロードが何らかの理由で失敗・中断された場合は不完全なファイルが出来上がります(壊れたファイルになり全く読めません)。

終わりに

少しハマって調べたけれど情報がなかったため記事にしました。結構致命的な問題だと思いますので、uriretrieveを使うのはやめておきましょう。