提示された環境から考えて
python(+pyodbc)
は64bit動作するので64bit用のODBCドライバが必要。
- だが、64bit用のドライバは32bit版のAccess製品版またはドライバとは共存できず。
(64bit用ドライバAccessDatabaseEngine_X64.exeのインストール時にエラーが発生する)
という状況だと思います。
Possible for 64bit Python to connect with 32bit MS access driver? にもあるとおり
- 64bit版pythonをアンインストールして、python32bit版をインストールする
- 32bit版Accessをアンインストールして、64bit版ドライバをインストールする。
のいずれかの方法をとるしかないと思われます。
ちなみに方法2としては、以下のように32bit/64bit共存する手法もあるようですが、レジストリを修正する必要などもあり、あまりお勧めできません。
64 ビット版の Microsoft データベース ドライバを 32 ビット版 Microsoft Office にインストールする方法
以上より
- 64bitOSにも32bit版VBScriptはインストールされている
- 32bit版VBSからなら32bit版ODBC経由で.accdbに接続可能
なので、私なら
- VBSで.accdbからTSV形式でテキスト出力
- pythonでTSVからデータ読込
という手段をとります。
実行例
accdb2tsv.wsf : .accdb->tsv出力するスクリプト。
wsh
1<job>
2<script language="JavaScript">
3
4// .accdb -> .tsv 出力
5function main(){
6 var arg = WScript.Arguments;
7 if( arg.length < 3){
8 return 1;
9 }
10 // (0) 入力.accdbファイルパス
11 // (1) 出力.tsvファイルパス
12 // (2) 出力SQL文 「SELECT * FROM table ORDER BY table.no;」
13
14 var oAdo = new ActiveXObject("ADODB.Connection");
15 oAdo.Open( "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + arg(0) + ";");
16
17 var oFs = new ActiveXObject( "Scripting.FileSystemObject");
18 var f = oFs.OpenTextFile( arg(1), 2, true);
19
20 var rs = oAdo.Execute( arg(2));
21 while( !rs.Eof){
22 var str = "";
23 for( var i = 0; i < rs.Fields.Count; i++){
24 str += rs.Fields(i);
25 if( i < (rs.Fields.Count-1)) str += "\t";
26 }
27 f.WriteLine( str);
28 rs.MoveNext();
29 }
30 oAdo.Close();
31 f.Close();
32 return 0;
33}
34
35var ret = 1;
36try{
37 ret = main();
38}
39catch( e){
40 WScript.Echo( "エラー:" + e.message);
41}
42WScript.Quit( ret);
43
44</script>
45</job>
accdb2tsv.py :
Python
1import subprocess, os
2import pandas as pd
3
4# .accdb -> .tsv に出力して pandasで読込
5# .accdb -> .tsv は WSHで行う
6def readAccdb( acc_path, tsv_path, sql_str):
7 wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 32bit版WSHを利用
8 wsh_path = os.getcwd() + r'\accdb2tsv.wsf' # ADOにて.accdb -> .tsv出力するWSH
9 # .pyと同一ディレクトリに存在すること
10
11 cp = subprocess.run( '%s "%s" "%s" "%s" "%s"' %( wsh_exe, wsh_path, acc_path, tsv_path, sql_str), shell=True)
12 df = None
13 if cp.returncode == 0:
14 df = pd.read_csv(tsv_path, header=None, delimiter='\t', encoding='cp932')
15 os.remove(tsv_path) # 不要なので削除
16 return df
17
18acc_path = os.getcwd() + r'\test.accdb'
19tsv_path = os.getcwd() + r'\test.accdb.tsv'
20sql_str = r'SELECT * FROM t_test ORDER BY t_test.no;'
21df = readAccdb( acc_path, tsv_path, sql_str)
22print(df)
結果例
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/12 09:51
2017/06/12 09:55
2017/06/12 10:42
2017/06/12 11:20
2017/06/13 04:54
2017/06/13 09:43
2017/06/13 10:34
2017/06/13 12:19
2017/06/14 00:39
2017/06/14 02:20