2.12. CSV形式によるエクスポートとインポート

CSV形式によるエクスポートとインポートでは、次のメソッドが用意されています。

機能 メソッド クラス
エクスポート export_to_csv_file Rows
エクスポート export_to_csv_file DAL
インポート import_from_csv_file Table
インポート import_from_csv_file DAL

同じ名前のメソッドが、 Rows もしくは Table クラスと、 DAL クラスに存在します。DALクラスの メソッドは関連するテーブルを全て、エクスポート・インポートします。

DAL クラスのメソッドは内部で、 Rows もしくは Table のメソッドを呼び出しています。このため始めに、 Rows 及び Tableクラスのメソッドを説明します。

1. export_to_csv_file メソッド( Rows クラス)

CSV形式でのエクスポートを行います。このメソッドは Rows クラスに属しています。

Rowsインスタンスを文字列に変換する場合も、特殊メソッドによって自動的にこのメソッドが呼び出されます。

  1. サンプル・・・Rowsインスタンスを文字列に変換して表示
    >>> rows = db(db.person).select()
    >>> print rows
    person.id,person.name
    1,Sapopadu
    2,Podatoso
    3,Pamadapa
    
  2. サンプル・・・personテーブルデータを test.csvファイルにCSV形式で出力
    >>> open('test.csv', 'w').write(str(db(db.person).select()))
    

    サンプルではRowsインスタンスをstr関数で文字列に変換していますが、 この時 export_to_csv_fileメソッドが動きCSV変換しています

  3. サンプル・・・明示的に export_to_csv_fileメソッド使用
    >>> db(db.person).select().export_to_csv_file(open('test.csv', 'w'))
    

    このサンプルは2のサンプルと同じ動きをします。

  4. サンプル・・・数値フィールド以外は文字列囲み記号をつけてファイル出力
    >>> import csv
    >>> db(db.person).select().export_to_csv_file(open('test.csv', 'w'),
    ...     quoting=csv.QUOTE_NONNUMERIC)
    

    export_to_csv_file メソッドのパラメーターを指定しています。

パラメータの説明は、 export_to_csv_file() を参照してください。

2. import_from_csv_file メソッド( Table クラス)

CSV形式ファイルからテーブルのへ、インポートを行います。このメソッドはTableクラスに属しています。

サンプルデータ
id,name
1,test

test.csv の中身です。データ件数が一件のCSVデータを格納しています。

サンプル
>>> db.person.import_from_csv_file(open('test.csv', 'r'))
>>> print db(db.person).select()
person.id,person.name
1,Cecemoso
2,Sopomoso
3,Dudusopa
4,test                  <- id==4 を挿入した

export_to_csv_file メソッドで作成したCSVファイルのフィールド名は、person.name のように頭にテーブル名が付きます。 しかし import_from_csv_file メソッドでは、先頭のテーブル名を無視してフィールド名だけを使います。 つまりインポートするCSVファイルでは、name のようにフィールド名だけでもOKです。

インポートでは id フィールドのデータは無視します。id はインポート時に新しく番号を振ります。

パラメータの説明は import_from_csv_file() メソッドを参照してください。

3. export_to_csv_file メソッド( DAL クラス)

アプリケーションの全てのテーブルをCSV形式でエクスポートします。

内部的には Rows クラスの export_to_csv_file() メソッドを呼んでいます。

サンプル
>>> db.export_to_csv_file(open('test.csv', 'wb'))

全てのテーブルを test.csv にエクスポートします。

出力結果のサンプル(test.csvの中身)
TABLE person
person.id,person.name
1,Potamata
2,Cotasata


TABLE dog
dog.id,dog.owner,dog.name
1,2,Masodusa
2,2,Tamatodu


END

複数のテーブルデータが一緒に出力されます。

出力フォーマットは次のようになります。
TABLE テーブル名
フィールド名1,フィールド名2,フィールド名3,・・・・・
フィールド1,フィールド2,フィールド3,・・・・・

テーブル間は \r\n\r\n で区切られます。

パラメータの説明は export_to_csv_file() を参照ください。

4. import_from_csv_file メソッド( DAL クラス)

CSV形式ファイルから、複数のテーブルへインポートします。

内部的には、 Table クラスの import_from_csv_file() メソッドを呼んでいます。

サンプル
>>> db.import_from_csv_file(open('test.csv', 'rb'))

インポートではidフィールドのデータは無視します。id はインポート時に新しく番号を振ります。

他のテーブルへの参照フィールドは同一のCSVファイルに含まれているデータなら、再採番した番号に 自動的に変更してインポートします。

パラメータの説明は import_from_csv_file() を参照ください。

参考: Exporting and Importing Dataデータのエクスポートとインポート