27
19

More than 3 years have passed since last update.

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

Posted at

結論

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

概要

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

urlretrieve
import urllib

urllib.request.urlretrieve(download_url, save_dir)

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

urlopen
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を使うのはやめておきましょう。

27
19
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
19