質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

20836閲覧

pythonからMSACCESSに接続したい

manataku

総合スコア45

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

3クリップ

投稿2017/06/12 03:22

python(jupyer)からMSACCESSに接続し、
pandasに取り込みたいのですがエラーとなります。

環境
OS: Windows 7 64-bit

Python version: Python 3.5.3 64-bit
pyodbc version: 4.0.16

Access version: Access 2013 32-bit
office365

実行したコード # coding: UTF-8 import pyodbc DBfile ='C:/Users/test.accdb' conn = pyodbc.connect('Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+DBfile)
エラーメッセージ Error Traceback (most recent call last) <ipython-input-14-c9cb2ea71cef> in <module>() 3 4 DBfile ='C:/Users/test.accdb' ----> 5 conn = pyodbc.connect('Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ='+DBfile) Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] �f�[�^ �\\�[�X������юw�肳�ꂽ����̃h���C�o�[�����\x82���܂���B (0) (SQLDriverConnect)')

試したこと
https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
インストール実施:AccessDatabaseEngine.exe

その他エラーより検索をしておりますが、解決には至らず、
pyodbc以外の方法などアドバイスをいただけないでしょうか。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

提示された環境から考えて

  • python(+pyodbc)は64bit動作するので64bit用のODBCドライバが必要。
  • だが、64bit用のドライバは32bit版のAccess製品版またはドライバとは共存できず。

(64bit用ドライバAccessDatabaseEngine_X64.exeのインストール時にエラーが発生する)

という状況だと思います。

Possible for 64bit Python to connect with 32bit MS access driver? にもあるとおり

  1. 64bit版pythonをアンインストールして、python32bit版をインストールする
  2. 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)

結果例

0 1 0 1 あ 1 2 い 2 3 う

投稿2017/06/12 06:52

編集2022/05/26 02:46
can110

総合スコア38260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manataku

2017/06/12 09:51

can110さん 回答ありがとうございます。 直接連携しなくとも.txtを挟むのも一つの方法ですね。 下記コードで動きましたのでこの方法でも検討してみます。 ``` import subprocess script = 'C:/Users/更新.vbs' subprocess.call('cmd /c'+ script) ```
can110

2017/06/12 09:55

そうですね。 vbs(wsh)にてテキストを介して読み書きするのも現実的な解だと思います。 例も追記しました。
manataku

2017/06/12 10:42

can110さん 例提示までありがとうございます!! 理解できるまで勉強することが多々ありそうですが、 少しづつ理解していきたいと思います。 将来的に64bitのofficeになった際には下記を変更することになりますでしょうか。 accdb2tsv.py # 32bit版  wsh_exe = r'C:\\Windows\\SysWOW64\\WScript.exe' # 64bit版  wsh_exe = r'C:\\Windows\\system32\\WScript.exe'
can110

2017/06/12 11:20

# 64bit版 wsh_exe = r'C:\\Windows\\system32\\WScript.exe' はい。64bit版ならsystem32~ですね。
manataku

2017/06/13 04:54

can110さん ありがとうございます。 自分でも応用できるように勉強いたします!
manataku

2017/06/13 09:43

can110さん 例示頂いたコードを試そうとしておりますが、エラーが出ております。 自己解決できず申し訳ありません。 実行方法としては下記でよろしかったでしょうか。 同フォルダに保存した状態 パターン1 accdb2tsv.py accdb2tsv.wsh スクリプトファイルが見つかりませんとエラーになります。 パターン2 accdb2tsv.py accdb2tsv.wsf test.accdb.tsv ファイルは作成され中身も出力されますが、 プロシージャーの呼び出し、または引数が不正ですとエラーになります。
can110

2017/06/13 10:34

パターン1は回答中の拡張子が誤っていました。正しくは「.wsf」です。失礼しました。 「プロシージャーの呼び出し、または引数が不正ですとエラーになります。」については、こちらでは再現しません。。。 .wsf側で発生しているはずですが、発生コード場所が特定できると何等かアドバイスできるかもしれません。
manataku

2017/06/13 12:19

can110さん ご確認ありがとうございます。 エラーの発生コード場所を特定するスキルがないため、 提示できませんがもう少し頑張ってみます。
manataku

2017/06/14 00:39

can110さん エラーとなる箇所がわかりましたのでご報告です。 sql_str = r'SELECT * FROM t_test;' TSVファイルは出力されていますが、 プロシージャーの呼び出し、または引数が不正ですとエラー カラム指定すると成功しました。 sql_str = r'SELECT A,b,c FROM t_test;' '*'に原因がありそうなことまで分かりました。 カラム指定すれば問題ありませんので、 アドバイスありがとうございました。
can110

2017/06/14 02:20

例示のためSQL文を短縮しすぎたようです。 「SELECT t_test.* FROM~」とテーブル名.*であれば問題ないと思います。 あるいはAccess上でクエリー作成し「SQLビュー」で表示されたSQL文を利用すると確実かと思います。
guest

0

https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-Microsoft-Access

上記ドキュメントにある通りに、まずは「Microsoft Access Database Engine」が正しくインストールできているかどうかから確認すると良いと思います。Microsoft Access Driver (*.mdb, *.accdb)が以下のコードで列挙されれば、そこから次のステップです。

>>> import pyodbc >>> [x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')] ['Microsoft Access Driver (*.mdb)']

※私の環境には該当のODBCドライバをインストールしていないので、当たり前ですがaccdbのドライバは表示されませんでした。

ここまでOKでもなおエラーが出るのであれば、次のステップはIM002というエラーコードがヒントになると思います。

投稿2017/06/12 06:16

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manataku

2017/06/12 07:05

Sakurai さん 回答ありがとうございます。 下記コードを実行したところ結果は空でした。 ``` import pyodbc [x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')] ```` If you see an empty list then you are running 64-bit Python and you need to install the 64-bit version of the "ACE" driver. 上記記載メッセージの通り、 https://www.microsoft.com/ja-jp/download/details.aspx?id=13255 AccessDatabaseEngine_X64.exe をインストールしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問