#Dropboxからファイルを直接Googleドライブにダウンロードする
##はじめに
####クラウド間でデータをやり取りするときローカル経由だと少々面倒です。
(例) Dropbox → ローカル → Google Drive
####今回は、Colaboratory を用いてDropbox から Google Drive に直接ファイルをダウンロードする方法を紹介します。
##処理のフロー
今回は、圧縮ファイル(.tar.gz) を例にダウンロードの方法を紹介します。
処理の流れは
- ColabでGoogle driveをマウントし、作業フォルダにする
- urllib を使ってURLからファイルをダウンロードする準備
- Drive上のファイルに書き込み
となります。
では、実際のコードを見てみます。
##コード
###1. ColabでGoogle driveをマウントし、作業フォルダにする
from google.colab import drive
drive.mount('/content/drive')
%cd "drive/My Drive"
ColabでDriveを使う時におなじみのやり方です。
###2. urllib を使ってURLからファイルをダウンロードする準備
import urllib.request
import os
# 対象のURL (末尾を "?dl=1" にする必要があります)
DROPBOX_URL = "https://www.dropbox.com/s/2qasmb81c1y3lud/ruby-2.6.3.tar.gz?dl=1"
# 保存ファイルの名前 (ここではダウンロード元と同じにしている)
filename=DROPBOX_URL[:-5].split('/')[5]
# 保存場所 = ドライブのtmpフォルダ以下
directory="tmp/"
URLの末尾がポイントです。普通は ?dl=0 になっていますので ?dl=1 に変えましょう。
また、今回は共有リンクで作成したURLのみが対象です。非公開のフォルダからダウンロードするためには別途Dropbox APIを使います。
関連リンク : Downloading a file using the Dropbox Python library
###3. Drive上のファイルに書き込み
# 大きなデータは256kb毎に細切りにして読み込む
chunk_size = 1024 * 256
with urllib.request.urlopen(DROPBOX_URL) as resp:
if not os.path.exists(directory):
os.makedirs(directory)
with open(os.path.join(directory, filename), 'wb') as f:
while 1:
chunk = resp.read(chunk_size)
if not chunk:
break
else :
f.write(chunk)
f.flush()
os.fsync(f.fileno())
データを区切って読み込むことで、大きなデータにも対応できます。
###結果
ls tmp/ # --> ruby-2.6.3.tar.gz
ちゃんと保存できました。
##終わりに
今回はDropboxのファイルをローカルを経由せずにGoogle Drive に落とす工程を紹介しました。
容量に余裕があるならばローカル経由でやる方が素直で分かりやすいですが、こんな方法もあるということで。
追記
dropboxはwgetでダウンロードできるので、urllibではなく、
!wget -O tmp/FILENAME "対象URL(末尾?dl=1)"
とした方が簡単です。