[Python] kintoe REST API を使ってファイルダウンロードしファイルで保存する

何を実現したいのかを書きましょう

PythonのRequestsを使ってAPIを実行しています。

下記の記事2つを参考にしています。
https://cybozu.dev/ja/id/c5da2ff7d17ed3b5764a4a3f/
https://cybozu.dev/ja/id/0cac896e13cc5a49602cc0c9/

【実現できていること】:
・レコード取得APIを使って添付ファイルフィールドにあるfileKeyを取得。
・ファイルダウンロードAPIを使ってfileKeyを元にファイルの内容データを取得。

【実現したいこと】:
・上記で取得したファイルの内容データを、ファイルの形にしてPC内に保存したい。

実行ソース

def kntnGetFile(key1, dmain, flKey, lg, msgFile):

    headers = {
        'Content-Type': 'application/json',
        'X-Cybozu-Authorization': key1,
        'X-HTTP-Method-Override': 'GET'
    }

    json_data = {
        'fileKey': flKey
    }

    url = 'https://' + dmain + '.cybozu.com/k/v1/file.json'

    for x in range(5):  # 再試行用のfor (5回もcontinueされることはないが念のため)
        try:
            if x == 0 : response = requests.post(url, headers = headers, json = json_data)

            # ステータスコードが4xx, 5xx番台の場合、再トライ
            if 400 <= response.status_code < 600:
                lg.warning('\"' + msgFile['WARNING']['00003'] + ' endpoint : ' + url + ' , message : ' + response.text + '\"')
                response = apiRetry(response, 3, 'kntn', 'post', url, headers, json_data)

            # 実行結果 (ステータスコード200,201以外は失敗)
            if 200 <= response.status_code < 202:
                pass            # 成功
            else:
                rslt += 1       # 失敗
            
            return rslt

        except Exception as e:
            # ステータスコードを返す以前のエラーの場合、再トライ
            lg.warning('\"' + msgFile['WARNING']['00005'] + str(e) + ' , endpoint : ' + url + '\"')
            response = None
            response = apiRetry(response, 3, 'kntn', 'post', url, headers, json_data)
            continue

.
取得したデータ(response.text)の内容は下記のようなものになっています。(一部抜粋)

'%PDF-1.5\n%忏嫌\n1 0 obj\n<< \n   /Type /Catalog\n   /Pages 45 0 R\n>>\nendobj\n2 0 obj\n<< \n   /Type /Pattern\n   /PatternType 1\n   /PaintType 1\n   /TilingType 1\n   /Resources << \n   /XObject << \n   /Img1 35 0 R\n>>\n>>\n   /Filter /FlateDecode\n ...

色々なサイトを見て試していたところ自己解決できました。
バイナリ書き込みモードで新規ファイル生成ファイルを閉じるの部分を追加することで
取得したファイル内容をファイルとして生成してくれることができました。

def kntnGetFile(key1, dmain, flName, flKey, lg, msgFile):

    headers = {
        'Content-Type': 'application/json',
        'X-Cybozu-Authorization': key1,
        'X-HTTP-Method-Override': 'GET'
    }

    json_data = {
        'fileKey': flKey
    }

    url = 'https://' + dmain + '.cybozu.com/k/v1/file.json'

    for x in range(5):  # 再試行用のfor (5回もcontinueされることはないが念のため)
        try:
            if x == 0 : response = requests.post(url, headers = headers, json = json_data)

            # ステータスコードが4xx, 5xx番台の場合、再トライ
            if 400 <= response.status_code < 600:
                lg.warning('\"' + msgFile['WARNING']['00003'] + ' endpoint : ' + url + ' , message : ' + response.text + '\"')
                response = apiRetry(response, 3, 'kntn', 'post', url, headers, json_data)


            # open()関数にwbを渡し、バイナリ書き込みモードで新規ファイル生成
            file = open(flName, 'wb')
            # 各チャンクをwrite()関数でローカルファイルに書き込む
            for chunk in response.iter_content(100000):
                file.write(chunk)
            # ファイルを閉じる
            file.close()


            # 実行結果 (ステータスコード200,201以外は失敗)
            if 200 <= response.status_code < 202:
                pass            # 成功
            else:
                rslt += 1       # 失敗
            
            return rslt

        except Exception as e:
            # ステータスコードを返す以前のエラーの場合、再トライ
            lg.warning('\"' + msgFile['WARNING']['00005'] + str(e) + ' , endpoint : ' + url + '\"')
            response = None
            response = apiRetry(response, 3, 'kntn', 'post', url, headers, json_data)
            continue
「いいね!」 2