def progress_hook(block_number, block_size, total_size):
if total_size > 0:
percentage = 100 * block_number * block_size / total_size
if percentage > 100:
percentage = 100
print '%2d%%' % percentage
def getYouTubeVideoByID(video_id, output_filename):
import re, urllib
url = 'http://www.youtube.com/v/%s' % (video_id)
real_url = urllib.urlopen(url).geturl()
match = re.findall("t=([^&]*)", real_url)
if match:
fetch_url = 'http://www.youtube.com/get_video.php?video_id=%s&t=%s' % (video_id, match[0])
print fetch_url
try:
urllib.urlretrieve(fetch_url, output_filename, progress_hook)
except urllib.ContentTooShortError:
print 'ContentTooShortError'
其中 progress_hook 是用來顯示進度的,如果不喜歡可以自己修改格式,或是在 getYouTubeVideoByID 裡面呼叫 urllib.urlretrieve 的地方把 progress_hook 這個參數拿掉。
使用方法: getYouTubeVideoByID(<id>, <file_name>)
範例:getYouTubeVideoByID('2scOjA_U09w', 'E:\\CCF.flv')
2008年9月3日 星期三
根據 ID 抓取 YouTube 影片
2008年6月18日 星期三
動態改變 instance 的 member function
首先先建立一個 class:
class foo:
def say(self, s):
print 'Hello, %s' % (s)
f = foo()
f.say('Bob')
這樣會印出 'Hello, Bob'。
如果想把裡面的 say 換成自己定義的 function,可以先定義該 function:
def helloworld(self, s):
print 'Hello World %s' % (s)
然後再用 new.instancemethod 把它給換掉:
import new
f.say = new.instancemethod(helloworld, f, foo)
f.say('Alice')
這樣就會印出 'Hello Wolrd, Alice' 囉
2008年4月29日 星期二
Python 的字元編碼
Python 並不像其它語言一樣,看你的程式碼檔案是什麼字元編碼就用什麼編碼來解讀內部的字串。所以必須在檔案開頭處清楚地宣告# -*- coding: utf-8 -*-
當然你的程式碼檔案也要存成對應的編碼才能正常執行。
而如果在一個 utf-8 編碼的程式碼裡,若要將某 utf-8 字串轉成 cp950 (在 Windows 上蠻常用的)的話,只要:str = "我是UTF-8的字串"
print str.decode('utf-8').encode('cp950')
就可以了。相當方便!
Python 版的 switch case
其實一直不太清楚為什麼 Python 內建的語法會沒有 switch/case 的用法,所以這時候只好自己做一下了
如果本來在 C 裡會寫這樣:x = 0;
switch (value) {
case 1:
x += 1;
break;
case 2:
x *= 5;
break;
...
}
那在 Python 裡可以寫成這樣:x = 0
{
1: lambda y: y += 1,
2: lambda y: y *= 5
...
}[value](x)
簡單地說就是用 dictionary 來作。
2008年4月24日 星期四
2008年1月26日 星期六
在 Mac 上編譯 Python 3 的問題
Python 3 (a.k.a. Py3k) 目前已經推出 3.0a2 的版本,我拿到 Mac 系統上編譯時,下的參數為:
./configure --prefix=/usr/local --enable-framework --enable-toolbox-glue --with-threads
結果在編譯時會出現這樣的錯誤:
LookupError: unknown encoding: X-MAC-TRAD-CHINESE
看起來是目前抓到的 encoding 會讓某個函式庫無法完成編譯,所以我修改了 Lib/io.py 這個檔案,然後把
encoding = locale.getpreferredencoding()
換成
encoding = "utf-8"
這樣就可以順利完成編譯了!
2008年1月24日 星期四
哪裡會用到 Python ?
如我們所知,Python 是一個 scripting language,只要有 Python 直譯器 (interpreter) 就可以執行 Python 程式。Python 在目前主流的作業系統如:Windows, Linux/Unix, Mac 等上都有相同版本的直譯器可以下載,你當然就可以在這些平台上撰寫 Python 程式。
從桌面系統的程式來說,Windows 上的 Python 可以透過 ctypes 使用 Windows API,也可以使用 IronPython 來結合 .Net framework 的程式庫;wxPython, PyGTK, PyQt, Jython 都是可以跨平台寫出 GUI 程式的函式庫,一些 GNOME 或 KDE 的 widget 就是用 PyGTK 或 PyQt 所寫出來的呢!而 Mac OS X 上當然也有 Python-Cocoa binding -- PyObjc 囉,這個只要灌好 Xcodes 就直接能用 Python 來寫 Mac OS X 應用程式。
除了桌面系統、個人電腦上執行的 Python 程式,在 Web 開發上也可以使用到 Python,除了直接使用 Python 的 CGI 函式庫或是直接處理 HTTP protocol,你也可以使用像是 Zope, Plone, TurboGears, django 等等 web 開發框架 (framework) 更直接地處理關於 web 的運算、顯示及資料儲存等。
另外,手持裝置當然也能執行 Python 程式,有人已經將 Python 直譯器放進破解的 iPhone/iPod touch, WinCE 系列的 smart phone 當然也能執行 Python,而 Symbian S60 也有弄出一套 PyS60,也就是讓你透過 Python 語言在 Symbian 系統上開發程式。
這樣乍看之下,Python 跟 Java 好像還有那麼一點點相像呢!不管是在 desktop, server, mobile device 都可以看到它們的影子,不過比起 Java, Python 的 code 可是輕巧得多,雖然 Python 有硬要縮排,以及稍稍殘廢的 OOP 架構等小缺點,但寫起 Python 程式,這些小缺點可說是瑕不掩瑜...
Python 已當選了 2007 年度程式語言,不如趁機來好好學學(寫寫)Python 吧!
