googledriveからデータを取得してpandasに読ませる
pythonからdriveにアクセスするコードを買いたのでそのメモ
とはいいつつもほとんどサンプルコードと一緒
pythonでgoogledriveへアクセスする
Google Drive APIs Python Quickstart
ここの手順通りに、pipでgoogleAPIから鍵を取得。
サンプルコードを修正 サンプルコードはファイルリストを出力するものなので、
fileIDを特定し、ファイルをダウンロードするように修正します。
manage-downloads
こまかいパラメータはここに書いてある。
#this code based on https://developers.google.com/drive/v3/web/quickstart/python
#
from __future__ import print_function
import httplib2
import os
import io
import pandas as pd
from io import StringIO
from apiclient.http import MediaIoBaseDownload
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/drive-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/drive'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Drive API Python Quickstart'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'drive-python-quickstart.json')
store = Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
def download():
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('drive', 'v3', http=http)
file_id = 'YOUR_FILE_ID'
request = service.files().export(fileId=file_id, mimeType='text/csv')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
#print("Download %d%%." % int(status.progress() * 100))
return fh.getvalue()
if __name__ == '__main__':
d=download()
df = pd.read_csv(StringIO(d.decode()))
print(df)
基本はサンプルコードにpandasをimportして、
ダウンロードしたデータはbyteなので、decodeしてstringIOにしてread_csvに変換。
地味にbyte型とstr型の変換がdecodeなのを忘れる
あとはjupyter notebookで表示して終わり。