株価データを取り込む

モジュールインポート、グローバル変数

sqlobject以外は標準モジュール。


# -*- coding: shift_jis -*-
import re,os,string
import datetime
from calendar import *
from sqlobject import *
import csv

rootDir = '/Users/*****/Desktop/kabu/'

データベース接続関数


def connectDb():
connection_string = 'sqlite://' + rootDir + 'data.db'
connection = connectionForURI(connection_string)
sqlhub.processConnection = connection

データインポート関数


def dataImport():
connectDb()
os.listdirで、rootDirのディレクトリ内のファイル一覧を呼び出し、配列iに格納する。配列iの各要素に対し、以下の処理を実行する。

for i in os.listdir(rootDir):
末尾がcsvのファイルを見つけたら、csv.readerでそれを開き、一行ずつ読み込む。読み込んだ結果は配列dataに格納される。

if re.search('?.csv',i):
for data in csv.reader(open(i,'r')):
dataの各要素は、

2006/01/04,1802,1,883,885,878,885,2543000

という構成になっている。読み出した時点では全部文字列として認識されている。

  • data[0]は、「/」を「-」に置き換え、sqliteが認識できる日付フォーマットに変換する(2006/01/04→2006-01-04)。
  • data[1]は銘柄コード、data[2]は市場区分。それぞれ整数に変換する。
  • data[3]〜data[8]は浮動小数点型に変換した上で、小数点以下3位を四捨五入する。


data[0]=data[0].replace('/','-')
data[1] =int(data[1])
data[2] =int(data[2])
for m in range(3,8) : data[m] = round(float(data[m]),2)
今回は東証1部の銘柄(data[2]が1のもの)だけをデータベースに格納する。

if data[2] ==1:
stockPrice(
date=data[0],
code=data[1] ,
market=data[2] ,
stPrice=data[3],
hiPrice=data[4],
loPrice =data[5],
fnPrice =data[6],
dekiDaka =data[7]
)
格納がすんだらos.removeでそのファイルを削除する。

os.remove(i)
以下は複数個のファイルをまとめ読みするとき専用のルーチン。(データ格納のときに1日分につき10分以上ハードディスクをがりがりやるので、こわくなってつけた)
1ファイルの格納が終了したら処理をいったん止めてプロンプトを出し、「n」もしくは「no」と入力したらそこで処理をいったん打ち切る。さもなくば続ける。

prompt = "Importimg datafile %s has finished. ?n Do you want to go further ?[y/n]" % i
okng = raw_input(prompt)
if okng in ('n','no') : break
if __name__ == '__main__':
connectDb()
dataImport()