2013年4月18日木曜日

PythonでGoogleドライブのSpreadsheet

Windowsのpythonを使って、GoogleドライブのSpreadsheetをテキストデータベースとしてアクセスしてみました。Web上に情報がたくさんあるのですが、いくつかつまづいたので、覚え書き。

まず、pythonで利用するモジュールですが、
http://code.google.com/p/gdata-python-client/
からダウンロードします。左側のフレームにあるDownloadsから、gdata-2.0.17.zipをダウンロードしました。
展開して、Windowsのコマンドプロンプトを起動します。
展開してできたフォルダに移動して、インストールを実行します。

> python setup.py install

使用するモジュールは、gdata.spreadsheet.text_dbです。
これを用いると、スプレッドシートの一行目を要素名(Field名)の記述として、それ以降の各行を1つずつのレコードとしてアクセスすることができます。

import gdata.spereadsheet.text_db

としたらOKです。
googleドライブにアクセスするのには、アカウント名とパスワードが必要です。とりあえずコンソールで動かすのでパスワードをgetpassモジュールで取得します。このモジュールを利用すると、エコーバックなしに、文字を受け取ることができるようです。

import getpass
pw = getpass.getpass('password >')

pwに入力文字列が入ります。
さて、emailにgmailアドレスをいれて、アクセスしましょう。

client = gdata.spreadsheet.text_db.DatabaseClient(username=email, password=pw)

つぎにスプレッドシートを選択します。
dblist = client.GetDatabases(name='sheetname')
さて、sheetnameの名前のスプレッドシートがdblistに入ります。nameで指定すると一つとは限りません。目的のスプレッドシートのみを指定できるわけではないので、注意が必要です。スプレッドシートのkeyで指定する方法であれば一つに決まるようですが、keyを知らないといけません。

name='sheetname'で選ばれる最初のスプレッドシートはdblist[0]です。
そのkeyは、dblist[0].spreadsheet_keyに入っています。

さて、スプレッドシートを選んだら、次はその中のシートを選びます。text_dbでは、それがtableになります。

tablelist = db.GetTables(name='sheet1')
こちらもname='sheet1'で選ばれるのは一つとは限らないので注意が必要ですね。とりあえず、最初のシートを開きましょう。似たような名前の複数のシートを作らなければ大丈夫でしょう。
table = tablelist[0]
そのテーブルに含まれるField名を得るには、

table.LookupFields()

を呼びます。すると、table.fieldsにリストされます。

さてレコードを順番にアクセスしていくには、table.GetRecords()でレコードのリストを得ます。

for rec in table.GetRecords(1, 100):
    #write process for each record.
    pass

で1番から100番までのレコードを順に処理していけます。

特定の条件のレコードを得たいなら、table.FindRecords()を使うことができます。たとえば、nameというFieldに'net walker'が入っているレコードを得たければ、recs = table.FindRecords('name == "net walker"')
とするとよいでしょう。

特定の行のレコードを得体なら、table.GetRecord()を使います。10行目のレコードなら、
rec = table.getRecord(row_number=10)
でよいでしょう。ここで、10行目といいますが、Field行が0行目として考えています。

さて、最初利用してみたとき、このレコードがうまく取得できませんでした。大切なのは、第1カラム(最初のField)が空のレコード(行)を作らないことのようです。空があると、レコードの終わりと認識するようですね。

レコード(rec)内の各フィールド内の文字は、contentという辞書として保存されています。たとえば、'name'というフィールドに入っている文字を得たければ、rec.content['name']として得られます。python2.7で扱うときは、unicodeに変換して利用するとよいでしょう。

str = unicode(rec.content['name'])

とすると、いろいろと処理が便利になると思います。

さて、text_dbモジュールのいろいろは、"gdata text_db"で検索をかけてみると見つかると思います。制限がありますが、割り切って使うと便利なこともあるかもしれません。

○スプレッドシートやテーブルを選択するときに、名前で引くと意図したもの一つだけが選択されるわけではない。
○第1カラムが空の行(レコード)は作らない
○そうそう、Field名は、半角英数小文字を使うとよいそうです。
○テーブル(ファイル内のシート)を削除するときは、シートがすべて無くならないようにする。

以上、つまづいたので、覚え書きしておきます。

0 件のコメント: