Python Tutorial 第一堂(4)Unicode 支援、基本 I/O
Python Tutorial 第一堂(3)哈囉!世界! << 前情 此文件已有新版,詳見〈Python 3 Tutorial 第二堂(1)Unicode 支援、基本 I/O〉。 在第一堂下課之前,來談談 練習 2:哈囉!世界! 做了什麼?為了方便,把範例程式碼再貼過來一下: # coding=UTF-8 filename = raw_input('檔名:') f = open(filename, 'r') b_str = f.read() f.close() print b_str.decode('utf-8') # 這是什麼? print b_str.decode('utf-8').encode('utf-8') # 這是什麼? Python 的 Unicode 支援第 1 行是 編碼宣告(Encoding declaration),這是個魔法註解(Magic comment),它告訴 Python 直譯器,這個原始碼檔案是以 UTF-8 來編碼,如果不這麼加上這個魔法註解,Python 2.x 會以 ASCII 編碼來解讀原始碼,那麼就會出現以下錯誤: SyntaxError: Non-ASCII character '\xe6' in file hello.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 魔法註解中設定了 UTF-8,這是因為在 Ubuntu 12.04 LTS 中,預設採用的文字編碼是 UTF-8。有趣的是,有時我上課會問學員一個問題:「你用的原始碼文字編碼是什麼?」很多學員答不出來,很多人不知道自己作業系統中開個純文字檔編碼是什麼,不知道在整合開發環境(Integrated Development Environment, IDE)中開個原始碼編碼是什麼,當然也就不知道為什麼把 A 專案的原始碼放到 B 專案中程式碼會出現亂碼。 如果你連 UTF-8 是什麼都不知道,那建議你看看我寫的 亂碼 1/2 中這幾篇文件: 在 Python 2.x,程式中所有文字都是 # coding=UTF-8 text = '測試' print len(text) # 顯示 6 這是因為 在 Python 2.x 中,如果想要用 Unicode 來代表文字,也就是想要用 # coding=UTF-8 text = u'測試' print type(text) # 顯示 "<type 'unicode'>" print len(text) # 顯示 2 直譯器執行程式時,會使用 除了使用 Unicode 字面常量來建立 在 Python 3.x 中,預設原始碼檔案必須是 UTF-8 編碼。如果原始碼檔案想要是 UTF-8 以外的編碼,同樣必須在第 1 行放置編碼宣告。Python 3.x 中,文字是 text = '測試' print(type(text)) # 顯示 "<class 'str'>" print(len(text)) # 顯示 2
如果想知道更多 Python 中有關文字編碼的細節,可以再參考 Python 的編碼 這篇文件。 基本 I/O接下來看看有關基本 I/O 的部份,你可以使用 以下是個實際的讀取程式範例: import sys file = open(sys.argv[1], 'r') content = file.read() print content file.close() 程式第一行匯入(import)了 類似地,一個寫入檔案的程式範例如下, import sys file = open(sys.argv[1], 'w') file.write('test') file.close() 如果要逐行讀取檔案呢?可以使用 import sys file = open(sys.argv[1], 'r') while True: line = file.readline() if not line: break print line file.close() 如果讀不到東西了,那
可以使用 import sys file = open(sys.argv[1], 'r') for line in file.readlines(): print line file.close()
實際上對於 Python 來說,讀取檔案最好的方式,就是不要去 import sys for line in open(sys.argv[1], 'r'): print line 這是 Python 的風格,也是 Python 的文化,這樣的寫法好處就是增加了可讀性,你不用自行使用 整合開發工具真正開發程式時,你也許會想要使用整合開發工具,在 Python 的世界中,我確實花了些時間去瞭解有沒有主流的整合開發工具,不過事後覺得,在 Python 的世界中,除了團隊因素決定之外,更多時候是個人口味問題,基於課程時間,我就不逐一討論我調查過的那些工具特色為何了,以下列出一些課程前調查過的幾個:
實際上似乎是如此,在 Python 社群中也有過這樣的一條討論: 第一堂課的內容就到這邊了,我們認識了 Python 環境的安裝與準備,寫了第一個 Python 程式,瞭解了一些 Unicode 支援,並看了些基本的 I/O,休息一下!後面要來進入第二堂課,瞭解更多 Python 語言的細節。 參考資源
* http://www.python.org/download/releases/3.0/
* http://docs.python-guide.org/en/latest/starting/install/linux/
* http://docs.python.org/2/using/cmdline.html
* http://docs.python.org/2/library/distutils.html
* http://openhome.cc/Gossip/Python/IOABC.html |
Duncan Chang
09/10
「你不用自行使用 close 關閉檔案,這個語法會在 for in 結束後自行關閉檔案」這句話似乎不適當,很容易誤會。
例中檔案會關閉是因為 file object 被回收,而不是 for ... in 語法有什麼特別之處。
Tzu-ping Chung
10/15
文末「後續」的連結壞了