2009年1月4日 星期日

windows 上讀寫檔案會遇到的問題

這是我在一個論壇裡面 post 的文章,其實我也常常忘記為什麼會被置換,每次都要重想一遍 =P ,所以貼來這邊作紀錄。




若不使用 binary mode 讀取寫入檔案,在 windows 上讀取與寫入分別會遇到的問題有:

讀取:
對 windows 來說,Ctrl-Z(1A) 也算是檔案結尾,因此只要遇到 hex 1A ,就會看到它停止讀取。

所以可以看到本來陋陋長的檔案變成只有一點點大

寫入:
我們一般在撰寫 python 程式的時候,標準的換行字元都是 \n(0A),所以如果我們要排版一個 string,我們都會做這樣的動作


>>> str = '老師您好:\n我是bmcool'
>>> print str
老師您好:
我是bmcool
>>>


但我們都知道 windows 的標準換行字元為 \r\n(0D0A) ,跨平台的腳本語言都會有這種自動偵測與轉換的能力,因此當你沒有交代你即將寫入的資料為 binary 時,python 為了讓你排版美美的字串在 windows 上有一樣的排版效果,就會很雞婆的幫你把 \n 轉換成 \r\n ...

也就是圖片中只要含有 hex 0A,全部都會變置換成 hex 0D0A ... 可以把上述範例的 str 寫入檔案,並用 16 進制編輯器打開來看看,就會發現是怎麼回事了。



Mac 的標準換行字元為 \r,對 python 來說也會有一樣的影響,它會把所有的 \n 都換成 \r ...

Linux 的標準換行字元與 python 相同,都為 \n,因此不會有任何轉換。

沒有留言: