Hatena::Grouppython

yanbe.py このページをアンテナに追加 RSSフィード

2009-01-15

livedoorクリップのデータをPython経由でSQLite3に読み込むサンプル

20:27 |  livedoorクリップのデータをPython経由でSQLite3に読み込むサンプル - yanbe.py を含むブックマーク はてなブックマーク -  livedoorクリップのデータをPython経由でSQLite3に読み込むサンプル - yanbe.py  livedoorクリップのデータをPython経由でSQLite3に読み込むサンプル - yanbe.py のブックマークコメント

公開するまでもないコードかもしれませんが,一応メモ代わりに.

まずはインデックスはつけないでやってみました.

#encoding: utf-8
import csv
import os
import sqlite3

csv_filename = "ldclip_dataset_200812.csv"
db_filename = "ldclip_dataset_200812.db"

if os.path.exists(db_filename):
  os.unlink(db_filename)

db = sqlite3.connect(db_filename)
db.text_factory=str

db.execute("""create table clips (
    user_id int not null,
    url varchar(255) not null,
    timestamp timestamp not null default CURRENT_TIMESTAMP,
    tags text)""")

i=1
for user_id, url, timestamp, tags in csv.reader(open(csv_filename)):
  db.execute("insert into clips values (?, ?, ?, ?)",
      (user_id, url, timestamp, tags))
  print '%d\r' % i,
  i+=1
db.commit()

もしかすると,SQLite単体でもインポートできるのかもしれませんが,

nabokov7; rehash : livedoor クリップのデータセットを公開しましたで紹介されている,PerlMySQLを使った例でいう

   fields terminated by ',' enclosed by '"'

のenclosed by '"'に相当する部分を指定する方法がSQLiteには無いようです.SQLiteでテーブルのスキーマを定義した上で,以下のようにlivedoorクリップが入ったcsvファイルを直接SQLiteインポートしようとすると,タグURLに含まれることのある","をフィールドの区切りとして誤認識してしまいます.

$ sqlite3 -separator , foo.db ".import bar.csv buzz"

この問題を解決するために結局Pythoncsvモジュールsqlite3モジュールを使いました.

トラックバック - http://python.g.hatena.ne.jp/y_yanbe/20090115