她——一種最初由Guido van Rossum開發的開源(Open Source)的指令碼語言。
Python已經有10年的曆史了,在國外十分盛行。 Google搜尋引擎的指令碼,現在流行的BT(Bite Torrnet),還有著名的應用伺服器Zope都是用Python編寫的。但在國內的使用還不是很多。她十分有自己的特色。文法簡潔,但功能強大,可以 跨平台使用,在Linux、Windows和Mac上都有很好支援。她的設計很出色。
這裡有兩個Python的使用例子,都是對磁碟檔案的操作,以次 來看看Python的特色。以下的程式是在 Windows平台上完成的。在Windows上安裝Python十分方便,到Python的官方網站(www.python.org)可以免費下載 Windows平台上的二進位安裝包後直接安裝就可以了,安裝程式會完成所有的配置,不用象Java一樣要自己設定環境變數。
情景一:
在檔案夾裡有六十多個RM格式的視頻檔案,我現在需要把它們的檔案名稱都提取出來,並去掉檔案的副檔名,以便放到需要的網頁裡。
應該有什麼軟體可以完成這個簡單的要求,可是一時間到哪裡去找這 樣一個符合要求的軟體呢?總不能手工完成把。在Linux上用強大的shell指令碼應該也可以完成,可是使用Windows的朋友呢?其實象這樣一個簡單 任務用Python這個強大指令碼語言只要幾條語句就可以搞定了。個大家知道,要完成這樣一個任務根本不用動用C/C++或Java這樣的大傢伙。
好來看看Python的身手,用自己喜歡的文字編輯器或者直接使用安裝包內建的IDE都可以:
# --- picknames.py ---
import os
filenames=os.listdir(os.getcwd())
for name in filenames:
filenames[filenames.index(name)]=name[:-3]
out=open('names.txt','w')
for name in filenames:
out.write(name+'\n')
out.close()
句字不多,一句句看。
# --- picknames.py --- 是注釋行,Python是用#作為注釋符的,每行注釋的開始都要添加。Python的原始碼是一副檔名py結尾的。
import os和其他大多數語言一樣,匯入os這個函數庫,在Python的術語裡叫模組。
下 面一句稍複雜一點用到了兩個os模組裡的函數,在調用的時候用os.限定。os.getcwd()的作用是返回一個表示當前工作目錄的字串,若是在 D:\python目錄下執行該程式則此函數返回的就是"D:\python"。程式中將此字串在作為參數傳遞給os.listdir()函數,它的作 用是返回一個參數所指定目錄的所有檔案名稱字串的列表,如果目錄內有檔案file1.rm file2.rm file3.rm,則傳回值是['file1.rm','file2.rm','file3.rm']。列表Python裡最常用的內建資料類型之一,他 用[]表示,其中的元素用逗號隔開。元素可以是各種資料類型,整形、字串,也可以是一個列表。Python是動態指令碼語言,不需要申明變數就可以直接使 用,所以filenames=os.listdir(os.getcwd())將當前工作所有檔案名稱字串的列表賦值給變數filenames。
for name in filenames:
filenames[filenames.index(name)]=name[:-3]
這 裡大家一看就知道是一個for迴圈,可是Python裡的for迴圈與C語言和Java等其他一些語言中的不完全一樣。這裡的迴圈用in關鍵字將 filenames中的元素依次賦給局部變數name,所以一迴圈一次name就能得到一個檔案名稱字串,這樣我們就可以曆遍所有的檔案名稱了。for是複 合語句所以用冒號結束,下一行是迴圈體。不知大家注意到了沒有Python裡沒有C/C++和Java裡用來標識語句快的花括弧。這正是Python的一 大特色,Python用每行開頭的縮排來實現同樣的功能。因此,原始碼裡的空格不在是為了美觀易讀,而是文法的要求。這也體現了Python的原始碼簡潔 緊湊的優點。filenames[filenames.index(name)]=name[:-3]這一句,在每次迴圈裡將name中的檔案名稱字串去 掉最後的3個字元,也就是.rm副檔名,然後重新賦給filenames列表中的每個元素。Python裡對列表和字串等的操作十分靈活,name[: -3]返回了一個新的字串。它去了name中從開頭到倒數第四個元素,-3表示從最後開始的第三個元素,但在提取操作中並不包括-3所表示的那個元素也 不改變變數name本身。filenames.index(name)返回列表裡和name值相同的元素的索引。這樣我們就可以把新的檔案名稱依次賦給 fienames了。
接著我們就可以把它們輸出到一個文字檔裡,以後粘貼的到別的地 方。用out=open ('names.txt','w')開啟一個名位out的檔案對象,open()函數在目前的目錄裡建立了一個名位names.txt的文字檔,w表示文 件對象out使用寫入模式(Write Mode),參數要用單引號括住。open()是內建函數並非os模組裡的函數,因此也不用os.來限定調用。
接著又是一個迴圈,依次將filenames裡的每個字串輸出到out檔案對象中,同樣要注意行首的縮排。
for name in filenames:
out.write(name+'\n')
out檔案對象調用write方法(函數),將每次迴圈裡不同的name的值寫到name.txt檔案中。\n想必學過一點編程的人都知道,是轉意字元表示分行符號。輸出完畢之後要調用close方法關閉out檔案對象:out.close()
這樣一個簡單的程式就完成了,將其儲存為 picknames.py,然後複製到需要的目錄中。在cmd命令列提示符視窗下鍵入python picknames.py(副檔名py不可少)或者在檔案夾視窗裡直接點擊運行它就可以,安裝好的解譯器會自動解釋並運行此程式。運行完畢之後就可以看到 檔案夾裡多了一個name.txt檔案,內容是:
file1
file2
file3
...
第一個任務輕鬆的完成了,看看下一個把。
情境二:
我有一些圖片檔案,要將其檔案名稱分別改為:00.bmp 01.bmp 02.bmp ... 23.bmp 24.bmp...
這樣一個任務有好象一下子也找不到什麼軟體軟體可以完成,那還是用Python把,這次我就把注釋直接寫在原始碼裡了:
# --- changeall.py ---
#匯入os模組
import os,sys
#取出當前工作目錄裡的檔案名稱列表。
filenames=os.listdir(os.getcwd())
#在1.bmp到9.bmp的檔案名稱前加0
#len()返回filenames列表的長度,xrange()返回一個從0開始到filenames列表的長度n的數列用於迴圈。
for num in xrange(len(filenames)):
#用if判斷語句排除程式檔案本身
#使用os模組中的rename(oldName, newName)函數來變更檔名。
#0到9的前十個檔案名稱錢加0,即00.bmp 01.bmp...
#str()函數返回數實值型別變數的字串
#第二個if語句中依然要注意行首的縮排
if filenames[num]!='changeall.py':
if num<10:
os.rename(filenames[num],'0'+str(num)+'.bmp')
else:
os.rename(filenames[num],str(num)+'.bmp')
走筆至此,看完了兩個情境的編程大家也能對Python有個大概的瞭解。希望大家能喜歡上這個文法幽雅功能強大的開源項目的語言,他可以高效地完成許多任務。更多的資料可以到www.python.org上尋找,網上的中文資料也有但不是很多。