February 2025
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 1 |
|
カテゴリ:Python
querycsv.py を使うと、次のように SQLデータベースと同じ形式でクエリが実行できる。-i でデータファイルを指定する。
地味に便利かもしれない。ということで、いじってみた。
みたいなこともできる。sum(somecolumn)とかもできる。どこまで対応しているか? SQLite にできることはできる。なぜならば、sqlite3.connect(":memory:") で開いた SQLite にデータを CSVファイルから読み込んでから、それに対してクエリを実行しているから。なんだそういうことかぁ。-f オプションを指定するとオンメモリではなく、SQLite ファイルを使う。ちなみに、insert とか update とかしても元の CSV ファイルには影響がない。 オンメモリでなく SQLite のデータベースファイルに書き出すこともできる。-f オプションで SQLite のデータベースファイルを指定し、適当なクエリを書く。-k オプションをつけるのを忘れないように。keep の意味で、実行後に SQLite ファイルを残すということ。-k がないと、SQLite ファイルが残らない。
生成された SQLite 形式のデータベースを入力として使うこともできる。同じデータに対して操作をするなら、その方が早いしね。-u で use するファイルを指定。
実行する SQL文はファイルにしておいて、-s オプションで指定することもできる。複数のデータベースファイルを JOIN するとかできる。 問題としては、このままだと日本語のデータが入っているとエラーになる。
まあ、そうだろうなとちょこちょこと手を入れたら、日本語も扱えるようになった。便利かもしれない。 どのあたりに手を入れたかと言えば、前に紹介した unicodecsv を使ってcsv データの読み書きをする。読み込んだ文字列はユニコードになるから、ascii の文字列とユニコードの文字列を + で連結しようとするとエラーになるので、そのあたり手を入れてみた。表示のときの文字幅が日本語だとちょっとやっかいなので、次のような関数を作って文字幅とした。全角文字か不明の場合は、2文字分の幅、それ以外なら 1 文字分の幅とする。u'あア a' なら 6 が返る。でも、端末で表示すると、そういう単純なやり方だときれいにそろわなかったりするけど...。経験的にスペース量を調整するようなコードを書いてみたが、スペースを入れない方が、むしろ見やすくて、潔い態度かもしれないなぁとか呟きながらも、ゴニョゴニョ...。
あと、querycsv.py のソースを見ていて、csv.Sniffer という存在に今更ながら気づいた。クォートがついているついてないとか、デリミターはなんだとか、形式を推定してくれるのね。って、前にも思ったことがある...。すぐ忘れる。
querycsv だと、open するとき "rt" になっているけれど、"rb" の方がよさそうか。unicodecsv では、sniffer がないので、判定は csv.Sniffer を使って、読み込むところだけやらせた。 とか、久々にコードをいじくっているうちに、大晦日があけて元旦を迎えてしまった。そういえば、まだ、私 Python 2 使ってんのねw とりあえず、こんな風になった。備考の後ろの「|」が揃ってるのね。単純に全角だから2文字分とかカウントしているだけではだめ。ljust でスペースを入れているところも直さないといけなかった。 ![]() ということで、なんだか中途半端でいい加減な終わり方だけど、本年もよろしくお願いいたします。 お気に入りの記事を「いいね!」で応援しよう
Last updated
2014.01.01 08:58:41
コメント(0) | コメントを書く
[Python] カテゴリの最新記事
|