Closed4

Google Colabでpandas.DataFrame ↔︎ スプレッドシートに読込み・保存するゾイ

noznoz

読込みするゾイ

from google.colab import auth
import gspread
from google.auth import default

def read_google_sheet_to_dataframe(url:str, sheet_name: str):
    """
    Google Colab環境で認証を行い、指定されたGoogleスプレッドシートの
    特定のシートからデータを読み込み、pandas DataFrameとして返します。

    Args:
        url (str): 読み込みたいGoogleスプレッドシートのURL。
        sheet_name (str): 読み込みたいシート(タブ)の名前。

    Returns:
        pandas.DataFrame or None: シートのデータを格納したDataFrame。
                                 エラーが発生した場合はNoneを返します(エラーメッセージはコンソールに出力されます)。
    """
    try:
        # 認証のためのコード
        auth.authenticate_user()
        creds, _ = default()
        gc = gspread.authorize(creds)

        # スプレッドシートを開く(シートURLから)
        ss = gc.open_by_url(url)
        worksheet = ss.sheet_name(sheet_name)

        df = pd.DataFrame(worksheet.get_all_records())

        return df

    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print(e)
noznoz

保存したゾイ

from google.colab import auth
import gspread
from google.auth import default

# スプレッドシートで保存する
def write_dataframe_to_google_sheet(df: pd.DataFrame, url: str, sheet_name: str):
    """
    与えられたpandas DataFrameの内容を指定したGoogleスプレッドシートの最初のシートに書き込みます。

    Args:
        df (pd.DataFrame): 書き込むpandas DataFrame。
        url (str): GoogleスプレッドシートのURL。
        sheet_name (str): シート名。
    """
    try:
        # 認証のためのコード
        auth.authenticate_user()
        creds, _ = default()
        gc = gspread.authorize(creds)

        # 型変換と欠損値処理
        datetime_cols = df.select_dtypes(include=['datetime64[ns]']).columns
        df[datetime_cols] = df[datetime_cols].astype(object)
        df_processed = df.fillna('').astype(str)

        # スプレッドシートを開く(シートURLから)
        ss = gc.open_by_url(url)
        worksheet = ss.worksheet(sheet_name)

        # ワークシートを更新
        worksheet.update([df_processed.columns.values.tolist()] + df_processed.values.tolist())
        print(f"DataFrameをスプレッドシート '{url}' に書き込みました。")

    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print(e)
noznoz

URLで指定したかった

  • ファイル名だと変更されやすい
  • keyでも指定できるがURLの方がすぐ確認できる
  • シートはインデックスとシート名で指定できるけど、インデックスは確認方法がわからないのでシート名に。

読取り・保存の関数でいちいち認証

  • どっちかしか使わないことがあるので

スプレッドシートの開き方

https://docs.gspread.org/en/v6.1.3/user-guide.html#opening-a-spreadsheet

  • ファイル名で指定
  • keyで指定
  • URLで指定

シートの指定の仕方

https://docs.gspread.org/en/v6.1.3/user-guide.html#selecting-a-worksheet

  • 番号で指定(番号は作った順?)
  • シート名で指定
noznoz

認可の部分

  • 関数で認可の部分は共通していて、どっちも関数を使う場合は1回すればいいのでクラスにまとめてクラス変数として持たせてもいい(処理に大した待ち時間ないのでしなくてもいい

  • クラスにしといて実行初期の時点で認可のインスタンス変数を宣言しておくと、ユーザーの操作を最初で済ませられるのでColabとして使いやすくなりそう。

# 認証のためのコード
auth.authenticate_user()
creds, _ = default()
gc = gspread.authorize(creds)
このスクラップは5ヶ月前にクローズされました