星期三, 5月 08, 2013

用 Python來開 Microsoft Access的.mdb資料檔

其實 Python算是蠻容易了解的語言,至少在語法上算是蠻貼近於我們使用的文字,加上眾多的函式庫的支援,幾乎就是你要的函式大多都可以找到。加上它算是網路世代的程式語言,在網路功能的支援也不惶多讓。不過,沒好好唸過程式語言的我,對於其中的物件還是不太熟悉。

我會使用Python,也是被逼的。當初要交程式報告時,實在是搞不懂要怎麼去get及put網頁資料。看過java及C,直覺並不是我可以在一個假日就完成這樣工作的。因為之前稍稍有看過Python的網頁,它的語法和basic,pascal或Matlab都蠻像的,而且可以查得到網頁相關的功能。

這幾年都接了單位的"品質"精進作業。每年都要想一個品質專案,因為有些事是不得搬上抬面的,所以大家都做些顯而易見,不傷大雅的議題。今年我特別抄去年的專案,只是用 Python寫好電子化的處理方案。在用Python處理時,遇見資料庫讀寫的問題,因為實在太少資料了,所以拿上來分享一下。

先說我的狀況:就是要去開一個已有的.mdb檔,讀出裏面的資料,再上傳到單位的網頁中。為了讀database檔,Python簡單解決方案為使用pyodbc,或是使用pypyodbc。兩者都可以讀一些主流的sql server,以及Microsoft excel和access的存檔。兩者的差異只有pypyodbc是純python的程式碼實作出來的。打開.mdb檔的方式如下:

###打開.mdb檔的方式

conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\\dir\\file.mdb')
cursor = conn.cursor()
cursor.execute('select * from ProgressNote;')
###



基本上用最後一行的cursor.execute,就可以使用類似sql的語法來截取所需要的資料。

但是,pyodbc對其他語言的支援實在是不好,光utf-8,就不太work了。像下述程式碼:

### http://www.g2w.me/2012/06/python-pyodbc-access-mdb-in-linux/對中文字元的建議
#
cursor.execute('select * from "省"')


原網頁的作者有交待,必須放置於""""中,但是我用下述程式碼:

### 我想像中的程式碼:
#
cursor.execute('SELECT * FROM ProgressNote WHERE "病歷號"=?','12345678')
#



卻很明顯,必需要存成ansi才可以work,如果存成UTF-8,很抱歉,就無法work。所以在我全部是存UTF-8的環境下,是無解的。

只能說,非常的讚同網友寫的下面這句話:
"pyodbc 是个很不错的库,api 也很好用,不过对中文支持的并不好,它并没有默认以 unicode 处理数据,所以对于中文相关的应用,编码问题无处不在,只得慢慢折腾了。"

3 則留言:

alarmz 提到...

要不要考慮使用 MS 提供的 ADODB 元件來操作
Access, 我覺得資料庫中欄位/Table 名稱用中文很怪也....附上參考網頁

http://www.alarmchang.com/wiki/index.php?title=ADO_command_%E7%AF%84%E4%BE%8B_%E9%80%A3%E6%8E%A5Offic_Access

alarmz 提到...

要不要使用 微軟提供的元件 ADODB 來存取 Access , MS 對於中文的支援還蠻不錯的
下面有範例
http://www.alarmchang.com/wiki/index.php?title=ADO_command_%E7%AF%84%E4%BE%8B_%E9%80%A3%E6%8E%A5Offic_Access

打字蛙 提到...

感謝!
等我最近三個報告結束,再來研究看看

//for syntaxhighlighter 3 //看一下載入的JS模組有哪些,不要的就刪掉 //end syntaxhighlighter 3