kuroの覚え書き

96の個人的覚え書き

Pythonを使ってSQLiteにTSVファイルをimport

sqlite3からは

> .separator "\t"
> .import hoge.txt hoge

とすればhoge.txtというTSVファイルからデータをhogeテーブルにインポートできる。
これをshell scriptからやるには

$ sqlite3  -separator $'\t' ./data.db ".import ./hoge.txt hoge"

これでいい。
じゃあPythonからやるにはどうしたらいいのだ?
TSVから読み込むのはあまり例が示されていないが、CSVから読み込むのは何例かあった。csv readerとかいうモジュールでcsvファイルを読み込んで、1行ずつinsertしていくという方法のようだが、このcsv reader はコンマ以外のdelimiterでもいけるらしい。
https://srad.jp/~tuneo/journal/514578/
なので
https://stackoverflow.com/questions/2887878/importing-a-csv-file-into-a-sqlite3-database-table-using-python

import csv, sqlite3
conn = sqlite3.connect("data.db")
curs = conn.cursor()
curs.execute("CREATE TABLE hoge (id INTEGER PRIMARY KEY, type INTEGER, term TEXT, definition TEXT);")
reader = csv.reader(open('hoge.txt', 'r'), delimiter= '\t')
for row in reader:
    to_db = [unicode(row[0], "utf8"), unicode(row[1], "utf8"), unicode(row[2], "utf8")]
    curs.execute("INSERT INTO hoge (type, term, definition) VALUES (?, ?, ?);", to_db)
conn.commit()

これで行けそうな感じ。

sqlalchemyでもなんとかなりそうな気がしてきた。

https://stackoverflow.com/questions/41389330/sqlalchemy-csv-import-into-sqlite
ここを参考にするなら

import csv
with open('hoge.txt', 'r') as input:
    tbl_reader = csv.reader(input, delimiter='\t')
    for row in tbl_reader:
        hoge.insert().values(type=row[0], term=row[1], definition=row[2])

これでいけるはず。テストしてみよう。
しかし、300カラム分の定義を書くのは骨が折れそうだなあ。

やってみた。

SyntaxError: more than 255 arguments

pythonは関数の引数が255個までしかつかえないんだと。
やっぱり駄目かな。

データアップロードは置いておいて、インメモリー動作の方をまず進めてみよう。