Help us understand the problem. What is going on with this article?

Pythonのrequestsを利用してファイルダウンロードする方法

More than 1 year has passed since last update.

1. はじめに

PythonのHTTPクライアントライブラリであるrequestsを利用して、普通のファイルダウンロードを行う方法について説明したいと思います。Rest API(json形式)によるファイルダウンロードについては次回説明する予定です。
なお、アップロードについては「Pythonのrequestsを利用してmultipart/form-dataのFormにファイルアップロードする方法」を参照ください。

2. ソースコード

fileDownloadDemo.py
# -*- coding: utf-8 -*-
import requests
import os
from datetime import datetime

# ★ポイント1
# ex) set DOWNLOAD_SAVE_DIR=C:/Temp/flaskDownloadSaveDir
DOWNLOAD_SAVE_DIR = os.getenv("DOWNLOAD_SAVE_DIR")

# main
if __name__ == "__main__":

    # ★ポイント2
    url = 'http://localhost:3000/report3/0000001'
    response = requests.get(url)

    # ★ポイント3
    contentType = response.headers['Content-Type']
    contentDisposition = response.headers['Content-Disposition']
    ATTRIBUTE = 'filename='
    fileName = contentDisposition[contentDisposition.find(ATTRIBUTE) + len(ATTRIBUTE):]

    # ★ポイント4
    saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
    saveFilePath = os.path.join(DOWNLOAD_SAVE_DIR, saveFileName)
    with open(saveFilePath, 'wb') as saveFile:
        saveFile.write(response.content)

★ポイント1

サンプルではダウンロードしたファイルを保存するディレクトリを環境変数から取得できるようにしました。

★ポイント2

requestsget()でファイルダウンロードのURLにアクセスします。特別なことはありません。なお、サンプルではHTTPのGETメソッドでアクセスするAPIにしています。

★ポイント3

requestsheadersを利用してHTTPレスポンスヘッダからContentTypeや添付ファイルのファイル名を取得します。
なお、サンプルのAPIは「Flaskでファイルダウンロードを実現する3つの方法」で紹介している内容を前提としています。

(注意)
サンプルのファイルダウンロードAPIではContent-Dispositionヘッダで添付ファイル名を指定する仕様としています。
Content-Dispositionヘッダは必須ではないので、APIによっては付与されていない場合もあるので注意してください。付与されていない場合はContentTypeから拡張子を類推してファイル名を決める必要があります。

★ポイント4

requestsのHTTPレスポンスのcontentを利用してダウンロードファイルのデータにアクセスし、バイナリデータをファイルとして保存します。普通のファイル保存の処理です。
サンプルでは★ポイント1で取得したディレクトリに、年月日時分秒のプレフィックスを付与して保存しています。

3. さいごに

今回はrequestsを利用して普通のファイルダウンロードを行う方法について説明しました。
次回はrequestsRest API(json形式)によるファイルダウンロードを行う方法について説明する予定です。

5zm
都内のIT企業でアーキテクトのお仕事をしてます。そのご縁で「Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発」を共著させて頂きました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした