まりものメモ帳

なぐり書き

自動でGoogle Driveにファイルをアップロードする(Python)

ぼく「OSと一緒にレポートを吹っ飛ばしてからデータ消えるのが怖すぎて毎秒Google Driveにアップロードしてる」
ともだち「自動化しろ、ぽまえ情報科やろ」
ぼく「あっ、そっかあ」

というわけでファイルを自動でアップロードするコードを書くことになりいろんなサイトの力を借りて書き上げました。今回の記事はそんときのメモです。

必要なやつのインストールと申請

今回はPyDrivegoogle-api-python-clientのインストールとGoogleへの申請が必要になります。申請といってもめっちゃ単純なので心配ないです。
端末にこのように打つとインストール出来ます。

#↓↓↓pipがインストールされていない時に実行↓↓↓#
$ sudo apt-get update
$ sudo apt-get install python-pip
#↑↑↑pipがインストールされていない時に実行↑↑↑#
$ pip install google-api-python-client PyDrive 

次は認証の説明…をしようと思ったのですが時間が無いのと長くなりそうなのといろいろあって認証をするにあたって参考にしたサイトを載せます。ごめんなさい。
news.mynavi.jp

setting.yamlを作業するディレクトリに配置したら次はコードです。

コード

サイトを参考にしながらカタカタやったコードです。

#coding:UTF-8
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from time import sleep
import datetime

#Googleの認証を行う
gauth = GoogleAuth()
gauth.LocalWebserverAuth()

#Google Driveのオブジェクトを取得
drive = GoogleDrive(gauth)

f = drive.CreateFile({
	'title':'レポートが終わらないよおお.odt',
	'mimeType':'application/vnd.oasis.opendocument.text'
})
f.SetContentFile('/home/admarimoin/ドキュメント/report/毎日徹夜.odt')

print("Uploading...")
f.Upload()
print("Uploaded!")

#現在時刻を取得して表示
now = datetime.datetime.now()
print("now:" + str(now))

#ファイルIDを取得して表示
file_id = f['id']
print('id:' + file_id)

try:
	while True:
		sleep(3600)
		report = drive.CreateFile({
			'id':file_id
			})
		report.SetContentFile('/home/admarimoin/ドキュメント/report/毎日徹夜.odt')
		print("Uploading...")
		report.Upload()
		print("Uploaded!")
		now = datetime.datetime.now()
		print("now:" + str(now))
except KeyboardInterrupt: 
	print("\ncancel.")

参考にしたサイト:https://news.mynavi.jp/article/zeropython-17/

ではコメントアウトで解説しなかった所以外を解説をしていこうと思います。

f = drive.CreateFile({
	'title':'レポートが終わらないよおお.odt',
	'mimeType':'application/vnd.oasis.opendocument.text'
})
f.SetContentFile('/home/admarimoin/ドキュメント/report/毎日徹夜.odt')

print("Uploading...")
f.Upload()
print("Uploaded!")

ファイルをアップロードをします。drive.CreateFileではtitleがGoogle Driveにアップロードされるファイル名になります。ここでは、/home/admarimoin/ドキュメント/reportにある毎日徹夜.odtというファイルがGoogle Driveにはレポートが終わらないよおお.odtとして保存されることになります。
mimeTypeは拡張子によって変わります。今回の例は.odtですが、.txtや.docxでmimeTypeが変わって来ます。
mimeTypeがまとまっているサイトがあったのでこちらを参考にして変えてください。
developer.mozilla.org

f.SetContentFileにはアップロードするファイル名を記入します。今回の例は絶対パスでファイルを指定してます。まあ個人的には絶対パス指定の方がいいかなとは思います。
f.Upload()でファイルをアップロードしてます。print("Uploading...")と入れたのは個人的になんか途中経過が見えてる感があって好きだからです。特に深い意味はありません。print("Uploaded!")はあった方が確実にいいです。無いと心配になります。
次はここです。

try:
	while True:
		sleep(3600)
		report = drive.CreateFile({
			'id':file_id
			})
		report.SetContentFile('/home/admarimoin/ドキュメント/report/毎日徹夜.odt')
		print("Uploading...")
		report.Upload()
		print("Uploaded!")
		now = datetime.datetime.now()
		print("now:" + str(now))
except KeyboardInterrupt: 
	print("\ncancel.")

while True:で無限ループを作ります。sleep(3600)で3600秒間(一時間)寝かせます。これを抜かすと毎秒アップロードするやべープログラムの完成です。
で、drive.CreateFileの'id'でさっき取得したIDを指定します。Google DriveはすべてID管理されているので、ファイル名は同じでも同じファイル名のIDの違うファイルがたくさん生成されて大変なことになるのでIDで指定してやります。それ以降の6行はさっきやったことと同じなので省略します。
try exceptについて…お話します。except KeyboardInterrupt:はCtrl + C(作業を中断する時によくやるやつ)が押された時に実行されます。なので「Ctrl + Cが押されるまでtry:の所を実行したるけど押されたらexcept KeyboardInterrupt:の所実行したろ!w」という意味になります。なにわろてんねん。なんでこんなやつをわざわざ入れたのかというと、この文が無い状態で中断してやったらなんか文句つけられたからです。何故なのか。
これで解説は以上です。拙い日本語でごめんなさい。お疲れ様でした。