Python內建的datetime模組可以輸出ISO format日期格式的文字,然而對於將文字轉換回datetime物件,就無能為力了。
經過網路查詢,必須得依靠另一模組dateutil (全稱是python-dateutil,可使用pip自動下載安裝) ,這模組自許做為datetime模組的加強功能,有許多對於日期時間好用的功能,今天我們專注在文字日期轉datetime
使用上很簡單
import dateutil.parser
date = dateutil.parser.parse("2016.11.03")
完成了,就這樣
這時的date = datetime.date(2016, 11, 3)
使用上不用做特別的註明,他都可以自行做判斷
不過是以美式時間格式[月在第一位]為主,如果是歐式[日在第一]的話需要用參數註明
date = dateutil.parser.parse("03.11.2016",dayfirst=True)
即使是iso format格式也難不倒
date = dateutil.parser.parse('2016-11-03T23:16:17+00:00')
2017年6月23日 星期五
2015年9月5日 星期六
asus eeepc 1015cx大復活
今天心血來潮的幫我的小筆電作升級
想當然耳,先前在windows 8遇到的顯示卡驅動不正常的問題
在windows 10 也遇到了
不過倒是不會有藍色畫面出現,只是顯示像素降到800x600
另外也無法外接螢幕
檢查了一下內部的顯示驅動是微軟內附的
於是試著看看用intel自己的驅動會如何
這台小筆電內部使用的是intel GMA 3600的顯示晶片(內部核心是Power VR)
在官網內找到最後一個版本號是8.0.4.1.1096 https://downloadcenter.intel.com/download/23473/Intel-Graphics-Media-Accelerator-3600-Series-for-Windows-7-32-bit-
這個版本在先前windows 8測試時無法開啟IE跟開始畫面(一開就當機)
然而...奇蹟發生了!!!
這個版本裝在windows 10 完全正常!!!
雖然安裝過程會顯示您已經安裝更新的10.0的版本,是否要覆蓋
別理他,覆蓋就對了 所有的問題終於完全迎刃而解!!!
天呀,感謝好兄弟的幫忙,又復活了一台舊電腦
想當然耳,先前在windows 8遇到的顯示卡驅動不正常的問題
在windows 10 也遇到了
不過倒是不會有藍色畫面出現,只是顯示像素降到800x600
另外也無法外接螢幕
檢查了一下內部的顯示驅動是微軟內附的
於是試著看看用intel自己的驅動會如何
這台小筆電內部使用的是intel GMA 3600的顯示晶片(內部核心是Power VR)
在官網內找到最後一個版本號是8.0.4.1.1096 https://downloadcenter.intel.com/download/23473/Intel-Graphics-Media-Accelerator-3600-Series-for-Windows-7-32-bit-
這個版本在先前windows 8測試時無法開啟IE跟開始畫面(一開就當機)
然而...奇蹟發生了!!!
這個版本裝在windows 10 完全正常!!!
雖然安裝過程會顯示您已經安裝更新的10.0的版本,是否要覆蓋
別理他,覆蓋就對了 所有的問題終於完全迎刃而解!!!
天呀,感謝好兄弟的幫忙,又復活了一台舊電腦
2013年3月4日 星期一
[DDE]Python3抓取DDE資料
DDE是一個很古老的傳輸格式,想不到直到win8 64bit版都還見的到蹤跡,根本是殭屍技術了吧! 不過在win8上卻意外地穩,似乎有做過改進。
就網路查詢到python想要連結DDE只能使用pywin32,然而該模組早在好幾年前就已經宣布不再維護其DDE功能,使得它只能是個做到一半的半成品。根據網友測試,似乎只能使用request,但大部分的券商軟體只支援Advise(廣播,這功能也比前者好用,只要資料有變動立即通知,前者是定期查看資料)。而且在python3,尤其是64位元環境就連連線都是一個困難點。
經過幾年漫漫追尋,終於找到另一個網友做的DDE client端,可支援常見的Advise模式,而且不需安裝其他模組可獨立使用。不過他是用python2寫的,因此我幫他改寫了一下,另外新增可為各別item指定處理函式(callback),經測試可在win8 64bit+python3.3 64bit正常運行
下載位置如下:
(位置已失效,詳情請見下面留言)
不用安裝,直接放到跟你的專案同目錄或者丟進x:\Python33\Lib\site-packages以便日後使用。
使用方式很簡單,以下用全球理財王作為範例,目標是取得韓股綜合指數
import PyWinDDE
# 初始化DDE的service及topic
dde = PyWinDDE.DDEClient("XQKGIAP", "Quote")
# 設定使用advise(廣播)取的所需的item
dde.advise("KS11.FS-Price")
# 進入訊息循環,以便持續不斷接收訊息(這部分若有用pyqt、tk等視窗模組便不需要)
PyWinDDE.WinMSGLoop()
我們修改第7行,指定newcall為處理資料的函數
dde.advise("KS11.FS-Price",callback = newcall)
注意,該函數必須依序有value,item作為參數,DDE會回傳item及資料過去。
以下是利用PyQt來做為範例,這個程式開啟後就會開始接收指定的DDE資料,若按下OK會自動將抓取的資料存成csv檔做後續使用:
import sys,csv,PyWinDDE
from PyQt4.QtGui import *
app = QApplication(sys.argv)
txtEdit = QTextEdit()
ok = QPushButton("&OK")
layout = QVBoxLayout()
widget = QWidget()
layout.addWidget(txtEdit)
layout.addWidget(ok)
widget.setLayout(layout)
widget.show()
tick = []
def recTick(value,item):
tick.append(value)
txtEdit.append(value)
def writeRec():
with open("test.csv","w") as f:
c = csv.writer(f)
for d in tick:
c.writerow(d)
widget.close()
dde = PyWinDDE.DDEClient("XQKGIAP", "Quote")
dde.advise("KS11.FS-Price", callback = recTick)
ok.clicked.connect(writeRec)
app.exec_()
今天就先到這裡,有機會再多聊一些吧。也歡迎大家提出問題。
2013年2月18日 星期一
[小技巧]讓print只在同個位置不斷更新顯示
很簡單
在print內增加"\r"及end=' ' 這兩個參數即可
第一個參數是令游標回到行頭
第二個參數則是要求結尾不做任何動作(預設'\n',也就是跳到下一行)
範例:
他就會不斷在同一列更新顯示你要的資訊,這在顯示進度上非常有用
在print內增加"\r"及end=' ' 這兩個參數即可
第一個參數是令游標回到行頭
第二個參數則是要求結尾不做任何動作(預設'\n',也就是跳到下一行)
範例:
print("處理進度:", x , "%" , "\r" , end=' ')他就會不斷在同一列更新顯示你要的資訊,這在顯示進度上非常有用
2013年1月17日 星期四
[小技巧]csv.writerow寫入多出空白一行問題解決
最近在做資料處理時發現,使用csv模組的writerow做多筆寫入時,每筆之間會莫名其妙空一行。這樣的狀況在記事本看不出來,用excel就會發現了。根據網路查詢得知,windows系統下會幫每一行結尾多加一個看不見的"進位符號",然而這個動作writerow本身就會幫我們做,所以等於重複按Enter兩次。避免這種狀況一般常見的解決方法是以binary的方式開啟檔案:
f = open("xxx.csv","wb")
c = csv.writer(f)然而這種方法在Python 3 下會產生錯誤:
ValueError: binary mode doesn't take a newline argument
在花了我一個下午找尋,才終於找到解決辦法,而且極其簡單,讓這一下午的心血變得很不值…
f = open('xxx.csv', 'w', newline='')後面加個newline=’ ‘的參數就好了。不過這招在Windows系統下有用,不知道到了Linux下會不會變成完全不會進位了? 這就有賴相關平台的朋友告知~
2013年1月15日 星期二
[PySide]導論
Python寫出來的程式大多是文字介面,雖然簡單但不夠人性化。目前Python可以用的GUI介面有幾種:內建的tkinter、連結Qt的PyQt和PySide、PyGTK、wxPython等等,然而應用在python3上的僅有內建的tkinter以及Qt系列的那兩種綁定,不過也幸好是QT系列有支援,因為他有許多強大的工具可以直接使用。
也許你會問:那PyQt與PySide的差別又在哪裡呢?
由於發展PyQt的公司Riverbank堅持不使用LGPL授權,要嘛就是GPL,要嘛就跟我買商業授權。當年Qt母公司Nokia交涉未果的情況下,只好自行另外做一個,形成少見的同樣套件功能卻有兩種實作。目前PyQt比較成熟,網路上的資源也很多。而PySide到近期才跨進Python3,比起來可能還比較不穩定,不過我倒希望有天也能和tkinter一樣收進標準程式庫。
雖然兩套系出同源,但還是有一些差別,另外目前中文資料大多是PyQt with Python2。為了以後查詢可以不用在腦內翻譯一次,直接打在這以後做參考。
第一件事當然就是安裝拉~
對於Windows方面,他有推出各種對應版本的安裝程式,建議直接用這個裝比較不會有問題,畢竟安裝時就折騰了,對它還會有好印象嗎?(笑)
下載位置:[http://qt-project.org/wiki/PySide_Binaries_Windows]
安裝後趕緊來測試一下,首先到python的IDLE或是命令列模式內,打入下面這行:
如果沒有任何錯誤的話,接下來打入下面這行:
它會顯示目前安裝的PySide的版本,我現在的就顯示 1.1.2,到這邊都沒問題的話,恭喜你已經完成安裝了,接下來可以開香檳會快速帶過一次如何建立一個基本的視窗。
首先開頭匯入PySide程式庫,幾乎所有的PySide至少需要匯入以下三個模組
接著建立PySide的程式實體,他負責處理大大小小你看不見的瑣事,注意:程式實體不等同於視窗,一個程式可以有很多個視窗(就像MSN之類的軟體,大學時代會開到20幾個對話視窗,但還是只有一個MSN的實體,想當年... ),但只會有一個實體。
接著我們建立一個按鈕,對應的是QPushButton物件
這裡要說明的是,由於PySide是以物件的方式寫的,所以當我們建立視窗元件時,他們會繼承視窗的特性,因此即使只有建立按鈕,Qt也會自動做建立視窗等動作。它的繼承序列如下:
QObject->QWidget->QAbstractButton->QPushButton
打個比方:就像我們跟電腦店老闆說我想要玩星海2,老闆會連同整台電腦灌好Windows系統最後加上星海2交給你(哪裡有這麼好的老闆!!!),不用刻意說我需要那些滑鼠、記憶體。
如果想要個人化一點可以加入下面的程式碼:
以上的設定很明顯都是從它的父元件繼承來的
接著由於預設視窗是隱藏的,因此在做好設定之後,我們要讓醜媳婦見公婆
基本上到這裡就沒事了,以前還要再多個button.exec_() 但經過我測試之後,發現現在不用這行視窗也不會自己關掉了(註一),現在執行看看效果如何

哈,看到視窗出來也沒有很興奮阿,不過別急著點擊按鈕,它是不會有任何反應的,下一篇再來介紹如何讓按鈕可以有實質的用途~
完整程式碼:
註一:由於windows上的程式基礎是事件驅動,比如說滑鼠點擊就是事件的一種,在事件沒發生時,大多晾在那邊等。然而傳統的python程式執行完程式碼就自己關掉了,這可不行,因此要使用exec_()讓我們的程式進入捕獲事件的狀態,而不要自己關掉說掰掰。
也許你會問:那PyQt與PySide的差別又在哪裡呢?
由於發展PyQt的公司Riverbank堅持不使用LGPL授權,要嘛就是GPL,要嘛就跟我買商業授權。當年Qt母公司Nokia交涉未果的情況下,只好自行另外做一個,形成少見的同樣套件功能卻有兩種實作。目前PyQt比較成熟,網路上的資源也很多。而PySide到近期才跨進Python3,比起來可能還比較不穩定,不過我倒希望有天也能和tkinter一樣收進標準程式庫。
雖然兩套系出同源,但還是有一些差別,另外目前中文資料大多是PyQt with Python2。為了以後查詢可以不用在腦內翻譯一次,直接打在這以後做參考。
第一件事當然就是安裝拉~
對於Windows方面,他有推出各種對應版本的安裝程式,建議直接用這個裝比較不會有問題,畢竟安裝時就折騰了,對它還會有好印象嗎?(笑)
下載位置:[http://qt-project.org/wiki/PySide_Binaries_Windows]
安裝後趕緊來測試一下,首先到python的IDLE或是命令列模式內,打入下面這行:
import PySide
如果沒有任何錯誤的話,接下來打入下面這行:
PySide.__version__
它會顯示目前安裝的PySide的版本,我現在的就顯示 1.1.2,到這邊都沒問題的話,恭喜你已經完成安裝了,接下來
首先開頭匯入PySide程式庫,幾乎所有的PySide至少需要匯入以下三個模組
import sys
from PySide.QtCore import *
from PySide.QtGui import *
接著建立PySide的程式實體,他負責處理大大小小你看不見的瑣事,注意:程式實體不等同於視窗,一個程式可以有很多個視窗(就像MSN之類的軟體,大學時代會開到20幾個對話視窗,但還是只有一個MSN的實體,想當年... ),但只會有一個實體。
app = QApplication(sys.argv)
接著我們建立一個按鈕,對應的是QPushButton物件
button = QPushButton("按我")這裡要說明的是,由於PySide是以物件的方式寫的,所以當我們建立視窗元件時,他們會繼承視窗的特性,因此即使只有建立按鈕,Qt也會自動做建立視窗等動作。它的繼承序列如下:
QObject->QWidget->QAbstractButton->QPushButton
打個比方:就像我們跟電腦店老闆說我想要玩星海2,老闆會連同整台電腦灌好Windows系統最後加上星海2交給你(哪裡有這麼好的老闆!!!),不用刻意說我需要那些滑鼠、記憶體。
如果想要個人化一點可以加入下面的程式碼:
#改變按鈕大小
button.resize(200, 75)
#改變視窗在螢幕的位置
button.move(500,300)
#設定視窗標題
button.setWindowTitle("我的第一個程式")
以上的設定很明顯都是從它的父元件繼承來的
接著由於預設視窗是隱藏的,因此在做好設定之後,我們要讓醜媳婦見公婆
button.show()
基本上到這裡就沒事了,以前還要再多個button.exec_() 但經過我測試之後,發現現在不用這行視窗也不會自己關掉了(註一),現在執行看看效果如何
哈,看到視窗出來也沒有很興奮阿,不過別急著點擊按鈕,它是不會有任何反應的,下一篇再來介紹如何讓按鈕可以有實質的用途~
完整程式碼:
import sys
from PySide.QtCore import *
from PySide.QtGui import *
app = QApplication(sys.argv)
button = QPushButton("按我")
#改變按鈕大小
button.resize(200, 75)
#改變視窗在螢幕的位置
button.move(500,300)
#設定視窗標題
button.setWindowTitle("我的第一個程式")
button.show()
註一:由於windows上的程式基礎是事件驅動,比如說滑鼠點擊就是事件的一種,在事件沒發生時,大多晾在那邊等。然而傳統的python程式執行完程式碼就自己關掉了,這可不行,因此要使用exec_()讓我們的程式進入捕獲事件的狀態,而不要自己關掉說掰掰。
2013年1月10日 星期四
[MySQL]Python連結MySQL---查詢篇
當我們連結資料庫後呼叫cursor()時便會建立一個cursor.MySQLCursor的物件,靠它可以很方便的操作資料庫。
其中最常見的就是execute()
這樣就是一個簡單的要求讀取students資料表內所有資料,不過執行這一行可能連一點回應都沒有,因為我們還需要呼叫fetch類的方法把資料取進python裡,這邊先暫時不提如何fetch,讓我們專注在execute上。
如同sqlite3套件,你也可以先將比較常用SQL命令打好,等到execute時再加入參數,例如:
如果資料量大,可以採用另一種方法executemany,例如:
executemany的作法是將所有資料嵌入SQL命令裡,例如範例內的程式會變成:
先前不知道在裡哪看到的文章,有提到在所有SQL批量插入的方法中,將所有資料塞在同一個命令是最快的方式。不過我想SQL命令在長應該也有個限度,不過我現在找不到那篇文章了…
當我們發出查詢命令之後,要將資料取進python做使用可以使用fetch類方法,最簡單的就是先前文章提到的fetchall(),他會以list的方式回傳所有資料或者是空list(無資料)。
另一種方式是一次取出一筆:fetchone(),若沒有資料便會回傳None,事實上根據官方文件,fetchall()也是用fetchone()來實作的
另外有一種簡便的方式可以替代fetchone()
最後要介紹的,cursor也如同sqlite套件裡的兄弟一樣提供兩個有用的屬性:
rowcount:提供上次操作所影響的筆數,此屬性僅限用於UPDATE和DELETE命令
getlastrowid:提供最後一個插入值的ID
意外的也來到第7篇了。雖然把文章寫出來,但果然都沒記到腦袋,時常翻閱。不過這樣其實也蠻方便的,哈哈。
其中最常見的就是execute()
MySQLCursor.execute(operation, params=None, multi=False)
顧名思義,這個方法是用來執行MySQL的命令,舉凡插入、查詢、刪除等都是要靠它。我們來看看它的使用方法吧:
cursor.execute("SELECT * FROM students")這樣就是一個簡單的要求讀取students資料表內所有資料,不過執行這一行可能連一點回應都沒有,因為我們還需要呼叫fetch類的方法把資料取進python裡,這邊先暫時不提如何fetch,讓我們專注在execute上。
如同sqlite3套件,你也可以先將比較常用SQL命令打好,等到execute時再加入參數,例如:
#方式一
insert = ("INSERT INTO student (name, birthday, age) VALUES (%s, %s, %s)")
data = ('小明',datetime.date(1998, 3, 23),15)
cursor.execute(insert, data)
#方式二
select = "SELECT * FROM student WHERE age = %(age)s"
cursor.execute(select, { 'age': 15 })
如果資料量大,可以採用另一種方法executemany,例如:
data = [('小胖', date(1998, 2, 12)),
('曉華', date(1998, 5, 23)),
('小明', date(1998, 10, 3))]
insert = "INSERT INTO student (name, birthday) VALUES (%s, %s)"
cursor.executemany(insert, data)executemany的作法是將所有資料嵌入SQL命令裡,例如範例內的程式會變成:
INSERT INTO student (name, birthday) VALUES ('小胖', 1998-2-12),('曉華', 1998-5-23),('小明', 1998-10-3)先前不知道在裡哪看到的文章,有提到在所有SQL批量插入的方法中,將所有資料塞在同一個命令是最快的方式。不過我想SQL命令在長應該也有個限度,不過我現在找不到那篇文章了…
fetchall()、fetchone()
當我們發出查詢命令之後,要將資料取進python做使用可以使用fetch類方法,最簡單的就是先前文章提到的fetchall(),他會以list的方式回傳所有資料或者是空list(無資料)。
另一種方式是一次取出一筆:fetchone(),若沒有資料便會回傳None,事實上根據官方文件,fetchall()也是用fetchone()來實作的
cursor.execute("SELECT * FROM students")
row = cursor.fetchone()
while row is not None:
print(row)
row = cursor.fetchone()另外有一種簡便的方式可以替代fetchone()
cursor.execute("SELECT * FROM students")
for row in cursor:
print(row)最後要介紹的,cursor也如同sqlite套件裡的兄弟一樣提供兩個有用的屬性:
rowcount:提供上次操作所影響的筆數,此屬性僅限用於UPDATE和DELETE命令
getlastrowid:提供最後一個插入值的ID
意外的也來到第7篇了。雖然把文章寫出來,但果然都沒記到腦袋,時常翻閱。不過這樣其實也蠻方便的,哈哈。
2013年1月6日 星期日
[MySQL]Python連結MySQL---連結篇
前面的文章大概提到要怎麼從MySQL獲取資料,今天我們先專注在連結的部分。
一個標準的資料庫操作大概如上,先以connect()連結並取得資料庫物件,待操作後呼叫close()來關閉與資料庫的連線。
其中connect()內的參數有21種之多(文後有介紹),常用的大概就是帳號、密碼、選取資料庫、資料庫HOST、PORT這五種。但如果你需要使用大量的參數,可以參考以下的連結方式:
如此可以將設定部分都移到檔頭甚至是另外的檔案方便做處理。
如果我們臨時想做切換帳號的動作呢?最直覺的想法應該是close原來的連線後再重新建立新的,不過可以不用這麼麻煩。直接呼叫config(參數如同connect())後再呼叫reconnect()重新連線即可
如果只是想改變所選擇的資料庫比較簡單:
其他如帳號、連線位置等皆可以同樣方式做查詢,但無法修改(修改一定得重新連線)
如果我們想偵測是否有與MySQL做連結,可以使用is_connect(),結果會回傳True/False
mysql.connector.connect()參數詳解
有空白的就是我不懂是甚麼意思XD,基本上會用到的也就那些。另外前三個後面有括弧,那個是套件設計者佛心來的,為了讓這個套件可以相容其他同樣也是Mysql連結python設計的,所以參數名互換是可以的。
[http://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html]
import mysql.connector
c = mysql.connector.connect(user='root', password='1234',database='employees')
#資料庫處理
c.close()
一個標準的資料庫操作大概如上,先以connect()連結並取得資料庫物件,待操作後呼叫close()來關閉與資料庫的連線。
其中connect()內的參數有21種之多(文後有介紹),常用的大概就是帳號、密碼、選取資料庫、資料庫HOST、PORT這五種。但如果你需要使用大量的參數,可以參考以下的連結方式:
import mysql.connector
config = {
'user': 'root',
'password': '1234',
'host': '127.0.0.1',
'database': 'employees',
'autocommit': True,
'raise_on_warnings': True,
}
c = mysql.connector.connect(**config)
#資料庫處理
c.close()
如此可以將設定部分都移到檔頭甚至是另外的檔案方便做處理。
如果我們臨時想做切換帳號的動作呢?最直覺的想法應該是close原來的連線後再重新建立新的,不過可以不用這麼麻煩。直接呼叫config(參數如同connect())後再呼叫reconnect()重新連線即可
import mysql.connector
c = mysql.connector.connect(user='joe', database='test')
# 以'joe'帳號登入
c.config(user='jane')
c.reconnect()
# 現在改以'jane'帳號登入
如果只是想改變所選擇的資料庫比較簡單:
c.database = 'teacher'
#改為讀取teacher資料庫
print(c.database)
#此結果會顯示出目前所選取的資料庫為何
其他如帳號、連線位置等皆可以同樣方式做查詢,但無法修改(修改一定得重新連線)
如果我們想偵測是否有與MySQL做連結,可以使用is_connect(),結果會回傳True/False
mysql.connector.connect()參數詳解
有空白的就是我不懂是甚麼意思XD,基本上會用到的也就那些。另外前三個後面有括弧,那個是套件設計者佛心來的,為了讓這個套件可以相容其他同樣也是Mysql連結python設計的,所以參數名互換是可以的。
[http://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html]
參數名 | 預設值 | 說明 |
| user(username*) | 資料庫帳號 | |
| password(passwd*) | 資料庫帳號的密碼 | |
| database(db*) | 想要連線的資料庫名稱 | |
| host | 127.0.0.1 | 資料庫伺服器位置(預設是本機電腦) |
| port | 3306 | 連結資料庫的port |
| unix_socket | ||
| use_unicode | True | 是否用unicode |
| charset | utf8 | 資料庫使用編碼集 |
| collation | utf8_general_ci | 資料庫使用編碼 |
| autocommit | False | 是否自動交易(commit) |
| time_zone | 設定時區 | |
| sql_mode | ||
| get_warnings | False | 是否獲取警告 |
| raise_on_warnings | False | 當例外發生時是否中斷 |
| connection_timeout | 連線等待時間 | |
| client_flags | ||
| buffered | False | 是否cursor物件在執行查詢後立刻獲取查詢結果 |
| raw | False | 查詢結果是否使用原生資料格式,而非python資料格式 |
| ssl_ca | SSL憑證授權 | |
| ssl_cert | SSL憑證檔案 | |
| ssl_key | SSL的key |
2012年12月29日 星期六
[MySQL]Python連結MySQL (包含python3.3)
先前的文章有提到關於python使用MySQL的部分,但一年前用python3以上去連結MySQL對我這種技術新手簡直是惡夢,所幸當我從另一個噩夢(兵役)走出來的時候MySQL官方已經提供解決方案了,官方ㄋㄟ!!!相容於Python DB API,所以如果會用內建的sqlite3模組的話會更好上手,用法差不了多少。
下載位置:http://dev.mysql.com/downloads/connector/python/
如果你跟我一樣是用最潮的python3.3+64位元的話,可能得要用命令列來安裝
首先在上面的網頁的select platform選擇Platform Independent
然後下載Zip 的壓縮檔
解壓縮到你想要的地方,比如說D槽
進入命令提示字元(CMD),到剛才解壓目錄的路徑
打入安裝命令:python setup.py install
應該是不會有甚麼問題,有的話大概是忘了裝Distribute套件或是沒設系統路徑吧
裝好就先來實驗看看
其中user是MySQL帳戶,passed則是密碼,執行成功的話應該是會出現目前在MySQL內有那些資料庫。基本上以上的程式碼可以解決大部分的需求了,稍微頗析一下分別是甚麼意思。
user = 帳戶名
passed = 帳戶密碼
database = 選取的資料庫名
如果要看某table內容可以下:"SELECT * FROM xxx"
今天大概就介紹到這邊,以後會四個部分做詳細介紹:connect、execute、fetch、error
另外小弟經驗也沒有很老道,也懇請各位指正錯誤,讓大家可以一起學習進步,感恩
下載位置:http://dev.mysql.com/downloads/connector/python/
如果你跟我一樣是用最潮的python3.3+64位元的話,可能得要用命令列來安裝
首先在上面的網頁的select platform選擇Platform Independent
然後下載Zip 的壓縮檔
解壓縮到你想要的地方,比如說D槽
進入命令提示字元(CMD),到剛才解壓目錄的路徑
打入安裝命令:python setup.py install
應該是不會有甚麼問題,有的話大概是忘了裝Distribute套件或是沒設系統路徑吧
裝好就先來實驗看看
import mysql.connector as sql
conn=sql.connect(host='localhost', user='root', passwd='')
c = conn.cursor()
a = c.execute("SHOW DATABASES")
for row in c.fetchall():
print(row)
其中user是MySQL帳戶,passed則是密碼,執行成功的話應該是會出現目前在MySQL內有那些資料庫。基本上以上的程式碼可以解決大部分的需求了,稍微頗析一下分別是甚麼意思。
mysql.connector.connect()
自然就是跟MySQL做連線,裡面可用的參數落落長(詳細可看這裡),但常用的大概就四個: host = 伺服器位置user = 帳戶名
passed = 帳戶密碼
database = 選取的資料庫名
mysql.connector.cursor()
傳回資料庫游標物件(MySQLCursor()),要對資料庫下命令必須要使用這個物件,這個物件可以衍生下面兩種常用的方法MySQLCursor.execute()
對資料庫下命令,範例內的"SHOW DATABASES",顧名思義就是秀出所有資料庫名字。如果要看某table內容可以下:"SELECT * FROM xxx"
MySQLCursor.fetchall()
執行命令後還需要將資料取出來,所以執行fetchall(),意思是一次將所有資料全部取出,python會自動將資料以list的方式取出。今天大概就介紹到這邊,以後會四個部分做詳細介紹:connect、execute、fetch、error
另外小弟經驗也沒有很老道,也懇請各位指正錯誤,讓大家可以一起學習進步,感恩
2012年12月28日 星期五
賀
離開軍旅生活(外島前線= =)也快兩個月了,忽然想看看只有三篇的鳥巢有甚麼近況,想不到瀏覽人次比我想像的多!(我以為只有小貓兩三隻)而且還有人引用我的文章,小弟受到很大的鼓勵。所以從今天起我會努力開始產出文章的! 也希望各位先進多多給小弟意見,可以交流喜歡的事物是身為人最大的福氣!
2011年11月15日 星期二
python3資料庫解決方案
P.S.此文件會持續不斷更新
SQLite
Python3裡就有內建SQLite的讀寫模組
MySQL
很遺憾,Python3對MySQL似乎沒有比較有完整的原生套件,目前最接近目標的是oursql
2012.12.29
目前MySQL官方自己主動推出套件,強調全部都使用python撰寫,安裝不須使用C的編譯器,而且依照python DB API規範,所以會用sqlite的人應該會用得很開心,詳細介紹如下
[http://nopython.blogspot.tw/2012/12/mysqlpythonmysql-python33.html]
[oursql 0.92]
下載位置--->https://launchpad.net/oursql/py3k/
說明文件--->http://packages.python.org/oursql/
但目前這份套件卻還沒幫Python3.2做獨立安裝套件,,只有3.1的,所以要自行安裝。但由於裡面用到Cython,所以還要弄C的編譯器,要設定MySQL路徑...安裝步驟繁瑣,看到就軟掉了...
[MySQL-python-1.2.3]
下載位置--->http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
說明文件--->http://mysql-python.sourceforge.net/MySQLdb-1.2.2/
這個套件是python2時代最受歡迎的MySQL套件,發展超過五年,也相當的穩定,網路上文件爆多,然而最大的缺點是它開發的步伐相當緩慢(從1.2.2到1.2.3就花了三年...),因此期待它變出python3的版本可望而不可及。所幸網路上總是有熱心人士,不只改寫成Python3的版本,還幫你包成獨立安裝檔,真的是佛心來的。不過相對的,由於是非官方作品,可能會有些網路現有資料所沒有紀錄的錯誤,故要小心使用。我自己用目前簡單的試用是沒甚麼問題。
Firebird
據說這個是三大免費資料庫中(PostgreSQL、MySQL、Firebird )中速度最快、彈性最好的資料庫,且同時支援如MySQL的伺服器式或是sqlite的嵌入式應用。然而文件卻少得可憐,連官網說明文件說是亂寫也不為過。在Python2有穩定的套件,在Firebird官網裡可以找到。但Python3目前只有下面這一套:
[firebirdsql 0.63]
下載位置--->http://pypi.python.org/pypi/firebirdsql/0.6.3
這一套我有安裝成功,但使用上一直搞不懂它執行的邏輯在哪裡,是說連原資料庫的相關資料都很少...等這套件在發展一段時間會再去研究,也許會是一顆尚未雕刻的璞玉。
泛用型兵器
SQLite
Python3裡就有內建SQLite的讀寫模組
MySQL
2012.12.29
目前MySQL官方自己主動推出套件,強調全部都使用python撰寫,安裝不須使用C的編譯器,而且依照python DB API規範,所以會用sqlite的人應該會用得很開心,詳細介紹如下
[http://nopython.blogspot.tw/2012/12/mysqlpythonmysql-python33.html]
[oursql 0.92]
下載位置--->https://launchpad.net/oursql/py3k/
說明文件--->http://packages.python.org/oursql/
但目前這份套件卻還沒幫Python3.2做獨立安裝套件,,只有3.1的,所以要自行安裝。但由於裡面用到Cython,所以還要弄C的編譯器,要設定MySQL路徑...安裝步驟繁瑣,看到就軟掉了...
[MySQL-python-1.2.3]
下載位置--->http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
說明文件--->http://mysql-python.sourceforge.net/MySQLdb-1.2.2/
這個套件是python2時代最受歡迎的MySQL套件,發展超過五年,也相當的穩定,網路上文件爆多,然而最大的缺點是它開發的步伐相當緩慢(從1.2.2到1.2.3就花了三年...),因此期待它變出python3的版本可望而不可及。所幸網路上總是有熱心人士,不只改寫成Python3的版本,還幫你包成獨立安裝檔,真的是佛心來的。不過相對的,由於是非官方作品,可能會有些網路現有資料所沒有紀錄的錯誤,故要小心使用。我自己用目前簡單的試用是沒甚麼問題。
Firebird
據說這個是三大免費資料庫中(PostgreSQL、MySQL、Firebird )中速度最快、彈性最好的資料庫,且同時支援如MySQL的伺服器式或是sqlite的嵌入式應用。然而文件卻少得可憐,連官網說明文件說是亂寫也不為過。在Python2有穩定的套件,在Firebird官網裡可以找到。但Python3目前只有下面這一套:
[firebirdsql 0.63]
下載位置--->http://pypi.python.org/pypi/firebirdsql/0.6.3
這一套我有安裝成功,但使用上一直搞不懂它執行的邏輯在哪裡,是說連原資料庫的相關資料都很少...等這套件在發展一段時間會再去研究,也許會是一顆尚未雕刻的璞玉。
泛用型兵器
[pyquery] 抓網頁資料的神器
前幾年以網路有的中文資料,用python抓網頁是個很複雜的動作。使用lxml這個強大的第三方套件,對,他很強,但可能我天資駑鈍,實在太難用了。抓一個資料還得去查他在網頁裡的xpath,查出來也不一定吃(我自己試用發現吃不了<tbody>標籤組),如果有個像phpquery一樣,我只要知道我要抓的資料位置所在的id,甚至知道是第幾個甚麼標籤,那不就方便許多了嗎?
所幸過了一年後,神聽到我的請求,pyquery降臨了
首先由於該套件是以lxml作為底層剖析引擎,所以先到下列網址下載安裝
http://pypi.python.org/pypi/lxml/2.3.2
不過上面網址只有釋放原始碼,要自己打指令安裝
如果你的作業系統是Windows,有福了,這邊有一指安裝檔,在下列網頁內
http://www.lfd.uci.edu/~gohlke/pythonlibs/
找尋lxml-2.3.2,然後根據你的版本選擇安裝檔
安裝好了,接下來就是主菜了
pypi把套件下載下來http://pypi.python.org/pypi/pyquery
由於pyquery沒有製作一指安裝檔,所以不管哪種作業系統都要打指令。
將套件下載下來,解壓縮後,以命令列的方式進入套件的目錄,然後執行
python setup.py install
帶著禱告的心情按下Enter鍵,如果沒有出現安裝錯誤,水!
裝好了之後就要來測試一下
首先我們來試試看台灣yahoo
假設我們要抓取奇摩的<title></title>之間的值,該如何做呢?
請輸入以下的程式碼
執行,你就會發現...
Yahoo!奇摩
怎麼會這麼簡單!!!
也許你會問,那可不可以用CSS的方式來抓呢?
假設我們要抓<a>標籤中屬於tag_fashion這個class的資料
把上面的程式碼中最後一行換成下面
各位有興趣自己試試看結果如何,ID值的道理也是一樣,把小數點換成#就可以了
不過又會有人問了:可是如果我要抓的資料位置沒辦法用ID方式指定,那該怎麼辦?
依然不難,該套件可以支援比如說我要抓第五個<p>標籤內的內容,方式如下
p.s. 用4的原因是因為python是以0開始記數,所以0是代表第1筆資料,4代表第5筆資料
一切就像做一塊小蛋糕一樣簡單
小弟今天就先寫到這,以後有緣會在介紹一些其他的應用。如果等不及,可以先看官方的說明文件http://packages.python.org/pyquery/index.html 。希望小弟的文章有幫到大家,再會~
所幸過了一年後,神聽到我的請求,pyquery降臨了
首先由於該套件是以lxml作為底層剖析引擎,所以先到下列網址下載安裝
http://pypi.python.org/pypi/lxml/2.3.2
不過上面網址只有釋放原始碼,要自己打指令安裝
如果你的作業系統是Windows,有福了,這邊有一指安裝檔,在下列網頁內
http://www.lfd.uci.edu/~gohlke/pythonlibs/
找尋lxml-2.3.2,然後根據你的版本選擇安裝檔
安裝好了,接下來就是主菜了
pypi把套件下載下來http://pypi.python.org/pypi/pyquery
由於pyquery沒有製作一指安裝檔,所以不管哪種作業系統都要打指令。
將套件下載下來,解壓縮後,以命令列的方式進入套件的目錄,然後執行
python setup.py install
帶著禱告的心情按下Enter鍵,如果沒有出現安裝錯誤,水!
裝好了之後就要來測試一下
首先我們來試試看台灣yahoo
假設我們要抓取奇摩的<title></title>之間的值,該如何做呢?
請輸入以下的程式碼
from pyquery import PyQuery as pq
q = pq(url='http://tw.yahoo.com/')
print(q('title').text())
執行,你就會發現...
Yahoo!奇摩
怎麼會這麼簡單!!!
也許你會問,那可不可以用CSS的方式來抓呢?
假設我們要抓<a>標籤中屬於tag_fashion這個class的資料
把上面的程式碼中最後一行換成下面
print(q('a').filter('.tag_fashion').text())
各位有興趣自己試試看結果如何,ID值的道理也是一樣,把小數點換成#就可以了
不過又會有人問了:可是如果我要抓的資料位置沒辦法用ID方式指定,那該怎麼辦?
依然不難,該套件可以支援比如說我要抓第五個<p>標籤內的內容,方式如下
q('p').eq(4).text()
p.s. 用4的原因是因為python是以0開始記數,所以0是代表第1筆資料,4代表第5筆資料
一切就像做一塊小蛋糕一樣簡單
小弟今天就先寫到這,以後有緣會在介紹一些其他的應用。如果等不及,可以先看官方的說明文件http://packages.python.org/pyquery/index.html 。希望小弟的文章有幫到大家,再會~
2011年11月13日 星期日
字串純化成數字
相信很多人平常會遇到在抓取網頁時,資料似乎沒有那麼純,比如說2,000中間多個逗號,要是強制轉為整數,呆呆的python肯定是要跟你翻臉。
那麼我們要做的變是純化數字,方法如下:
比如說我們要把這樣的字串12dff412df54純化成1241254
''.join([x for x in '12dff412df54' if x.isdigit()])
P.S.以上資訊感謝PTT之juiz提供
訂閱:
文章 (Atom)