Python and ActiveX Data Objects (ADO)を参考にMS AccessのMDBにアクセスしてみました。
使用しているMDBは「Win32OLE 活用法 【第 3 回】 ADODB」のsample1.mdbです。
# -*- coding: cp932 -*- import win32com.client import sys import codecs # 参考 # http://www.ecp.cc/pyado.html#1 conn = win32com.client.Dispatch(r'ADODB.Connection') DSN ='DRIVER={Microsoft Access Driver (*.mdb)};Dbq=C:\\Python27\\test\\COM\\sample1.mdb' # MS SQL Server のとき # DSN ='Provider=SQLOLEDB.1;Password=xxxxxxx;User ID=xxxx;Initial Catalog=DBname;Data Source=tcp:192.168.1.123,1433' conn.Open(DSN) rs = win32com.client.Dispatch(r'ADODB.Recordset') rs_name = 'earthquake' strsql = '"SELECT * FROM earthquake;' rs.Open('[' + rs_name + ']', conn, 1, 3) # rs.Open(strsql, conn, 1, 3) print rs.RecordCount # => 4 flds_name = {} flds_Value = {} fCount = rs.Fields.Count # フィールド数 for x in range(fCount): flds_name[x] = rs.Fields.Item(x).Name # フィールド名 print flds_name # => {0: u'Name', 1: u'Day', 2: u'Magnitude', 3: u'NumOfDeaths', 4: u'DeadOrAlive'} rs.MoveFirst() print type(rs.Fields.Item(0).Value) #=> <type 'unicode'> print type(rs.Fields.Item(0).Value.encode('cp932')) #=> <type 'str'> print rs.Fields.Item(0).Value.encode('cp932') #=> 関東大震災 print rs.Fields.Item(0).Value #=> 関東大震災 print rs.Fields.Item(0).Type #=> 202 print rs.Fields.Item(0).DefinedSize #=> 50 # 全データをtable_Valueに取得する。 rs.MoveFirst() count = 0 table_Value = {} while 1: if rs.EOF: break else: flds_Value = {} for x in range(fCount): flds_Value[x] = rs.Fields.Item(x).Value table_Value[count] = flds_Value count = count + 1 rs.MoveNext() print table_Value # {0: {0: u'\u95a2\u6771\u5927\u9707\u707d', 1: <PyTime:1923/09/01 0:00:00>, 2: 7.9, 3: 142807, 4: u'-1'}, # 1: {0: u'\u962a\u795e\u6de1\u8def\u5927\u9707\u707d', 1: <PyTime:1995/01/17 0:00:00>, 2: 7.2, 3: 6418, 4: u'-1'}, # 2: {0: u'\u65b0\u6f5f\u770c\u4e2d\u8d8a\u5730\u9707', 1: <PyTime:2004/10/23 0:00:00>, 2: 6.8, 3: 37, 4: u'-1'}, # 3: {0: u'\u5317\u6d77\u9053\u6771\u65b9\u6c96\u5730\u9707', 1: <PyTime:1994/10/04 0:00:00>, 2: 8.1, 3: 0, 4: u'0'}} # フィールドの型を表示してみる。 for x in range(fCount): print type(table_Value[0][x]) #=> <type 'unicode'> # <type 'time'> # <type 'float'> # <type 'int'> # <type 'unicode'> # 全テーブル表示 oCat = win32com.client.Dispatch(r'ADOX.Catalog') oCat.ActiveConnection = conn oTab = oCat.Tables for x in oTab: if x.Type == 'TABLE': print x.Name #=> earthquake rs.Close() conn.Close()
ConEmuのutf-8環境で文字列出力がエラーになって苦労したのですが、Windows PowerSHell で実行すると問題が発生しませんでした。
$ python ecpcc2.py 4 {0: u'Name', 1: u'Day', 2: u'Magnitude', 3: u'NumOfDeaths', 4: u'DeadOrAlive'} <type 'unicode'> <type 'str'> ・ヨ東大震災Traceback (most recent call last): File "ecpcc2.py", line 35, in <module> print rs.Fields.Item(0).Value.encode('cp932') #=> 関東大震災 IOError: [Errno 0] Error