今回は 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 です。便利ですねー。