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で表示して終わり。

connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

Jp, Tokyo https://connvoi.com