GitLFSを使用せずに100MB以上のファイルを扱う方法

2022/12/27に公開

1.はじめに

ここ一年ほど使用していたクラウドアプリケーションプラットホームであるHerokuは、2022年11月28日より無料プランが廃止されてしまったため、他のサービスであるRenderに移行しました。
RenderはGithub連携で簡単にデプロイを行うことができるサービスですが、Githubでは100MB以上のファイルを管理できないという欠点があり、 Git Large File Storageなるものがあるのですが、無料枠は1GBまで。。色々調べているとGoogleDriveからダウンロードする方法を見つけたので備忘録として記述していきます。

2.本記事のゴール

ローカル環境にGoogleDriveからファイルをダウンロードできれば達成とします。

3.実行環境

MacBook Pro(M1)
VisualStudioCode
Python 3.10.6

4.フォルダ構造

フォルダ構造は実行前の状態は下記のようになり、
zenn
└── download.py

上記のdownload.pyをターミナル上から実行後は同じディレクトリにファイルがダウンロードされます。

zenn
├── download.py
└── ダウンロードしたファイル

5.実行前の準備

今回はGoogleDriveよりファイルをダウンロードするため、自分のGoogleDriveにダウンロードしたいファイルをアップロードしておく必要があります。また、その際に下記画像のようにファイル共有の設定をしておく必要があります。


上記の設定をしてリンクをコピーしてメモ帳などに控えておきます。(後々使用します。)
作成されたリンクは下記が一例となりますが1KVLaGYGquzx-gEcCZLiDSf5ui8D4WEVOの部分のみでも大丈夫です。
https://drive.google.com/file/d/1KVLaGYGquzx-gEcCZLiDSf5ui8D4WEVO/view?usp=sharing

6.作成コード

download.pyの記述コードの説明をしてます。
今回はsubprocessモジュールを使用し、subprocessモジュールはPythonからコマンドを実行できます。

download.py
import subprocess 

def main():
    # ファイルをダウンロードするコマンドを定義する
    command = '''
    curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id={ここにidを記載}" > /dev/null
    CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)" 
    curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id={ここにidを記載}" -o {ファイル名}
    '''
    #subprocessを使用してPythonのファイル内からシェルコマンドを実行
    subprocess.run(command, shell=True)

if __name__ == "__main__":
    main()

download.py内のcommand変数の三箇所ほど(idを記載する箇所が二つと保存したいファイル名を記述する箇所が1つ)をカスタマイズする必要があります。
まず、{ここにidを記載}という部分についてですが、5.実行前の準備で控えておいたファイルのidを記述します。また、{ファイル名}の部分は保存したいファイル名を記載するようにします。
3箇所記述が完了すると後はターミナルから'python donload.py'を実行するとファイルがダウンロードされます。

7.最後に

subprocessを使用してかなり便利だと感じたので、他にも応用できるものがありそうだと感じました。
もちろん実装は一つだけではないため、もっと簡単なやり方法があればぜひ教えてください。
ここまで読んでいただきありがとうございました。

Aidemy Tech Blog

Discussion