Python Tips: zip ファイルをインターネットからダウンロードして利用したい

今回は Pyhton で zip ファイルをインターネットからダウンロードして利用する方法をご紹介したいと思います。

ダウンロードの部分は Python を代表する requests ライブラリ、 zip ファイルの取り扱いの部分は標準ライブラリの zipfile を使う方法がおすすめです。

import requests
import zipfile

まずはダウンロードから見てみましょう。

import requests

# @see https://stackoverflow.com/questions/16694907/how-to-download-large-file-in-python-with-requests-py

def download_file(url):
    """URL を指定してカレントディレクトリにファイルをダウンロードする
    """
    filename = url.split('/')[-1]
    r = requests.get(url, stream=True)
    with open(filename, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
                f.flush()
        return filename

    # ファイルが開けなかった場合は False を返す
    return False

ファイルサイズが大きくてもいいようにするには requests.get の steam オプションや iter_content などを使います。このコードはほぼ丸々上記 URL の Stack Overflow のところのものを使っています。

以下のようなコードで動作確認することができます。

if __name__ == "__main__":
    # 郵便局の郵便番号データをダウンロード
    url = 'https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip'
    filename = download_file(url)
    if filename:
        print('{} is downloaded.'.format(filename))

つづいて zip ファイルを扱う部分を。こちらは zipfile が提供するクラスと関数を使えばわずか数行です。

import zipfile

def zip_extract(filename):
    """ファイル名を指定して zip ファイルをカレントディレクトリに展開する
    """
    target_directory = '.'
    zfile = zipfile.ZipFile(filename)
    zfile.extractall(target_directory)

こちらも確認してみましょう。

if __name__ == "__main__":
    # 郵便局の郵便番号データをダウンロード
    filename = 'ken_all.zip'
    zip_extract(filename)

問題なく動作することが確認できたら、これらをつなぐとよいでしょう。

あとは展開されたファイルを好きなように利用すれば OK です。便利ですねー。