好,那接下我們來介紹檔案的讀寫。
[空白_錄音] 那檔案讀寫這件事情啊,就是我們其實是
通常是我們寫程式里的日常的一部分,那就是說在很多時候呢,我們常常需要
讀檔或者是寫檔,那這個所以比如說,你如果需要處理資料的話,常常會做的事情
就是說,我們會先從這個從一個資料檔裡面把資料讀進來,對不對?好。
然後呢,我們做一些處理哦。
比如說,做一些運算啊、 做一些計算之類的,然後最後我們
會把這個結果寫出來,寫到另外一個檔案,或寫到同一個檔案之類的。
那或者說 很多時候我們這個很多應用程式在起始
的時候呢,我們事實上會從一個所謂的設定檔裡面會讀一些設定,好。
那這些設定可能是一些預設的一些設定或者說是也許是你前一次記下來的設定,所以你才不用
重新在每次這個 run 同一隻 程式的時候,你要再重新設定一次,對不對。
它會幫你把這個東西記起來,好。
那當然就是說你在這個程式結束的時候,我們常常會需要把這個設定寫回這個檔案,對不對?
下一次這個程式重新再啟動的時候,你就會就知道說我們 最後是做到哪裡之類的這種事情,或者之前的設定是什麼樣子。
那所以呢,這些東西都是這個 常常會需要藉助這個檔案系統的一些這個
讀寫的一些這個服務啦,那另外就是如果說你在處理的資料你是
資料量很大的時候,有時候也會需要做這個讀檔寫檔的事情,就是說我們可能會做一些這個暫- 存的工作,對不對?
好,就是我們讀進來的東西很大,我們要把一次全部都放到記憶體裡面,放到 我們的這個變數裡面,所以我們就是會
先把東西先寫到檔案裡面去,然後先拿一小塊,每次拿一小塊出來處理,這些都是常見的
一些手法,所以呢,所以這個讀檔跟寫檔事實上是非常重要的啦,所以我們今天就大概做一些 這個簡單的介紹。
那所以呢,這個在 Python 裡面做檔案的
這個處理的話,這是這個 typical 的流程大概是這樣子哦,就是事先
打開一個檔案,不管你是讀還是要寫,你都是要先把這個檔案給打開。
那打開之後呢,你就看你是要讀或者是要寫,你就是要做你該做的事情。
好,然後呢最後呢要把當然關起來,大概就是這三個步驟。
那這三個步驟 是這個 essentially 你必須要知道的,那這個事情是都不可以缺少的,就是說呢那你如果說只有
開檔,然後你如果沒有把檔案關起來的話,你的你寫進
檔案的這些資料可能會流失,那當然就是說現代的這種 程式語言,比如說
Python 它事實上自動會幫你做一些這個清理的工作,比如說你如果忘記
把檔案關起來的話,如果你是在大部分的狀況下面,你程式結束的時候,Python 事實上會幫你做一些這種
關檔的動作,但是你不應該賭這件事情,你應該要自己做這個事情。
那 對,所以這個做完之後把檔案關起來是一件很重要的
事情,是一件應該要記得,要做這件事情。
那你如果 沒有好好去關檔的話,可能會就是說你資料寫進去,檔案的資料可能會不見。
好,那所以我們具體要怎麼做呢?那比如說在
Python裡面要處理檔案的話,就是一般來說開檔就是用這個指令,就是 open。
好,open。
然後呢,你用這個 函數,open 這個函數它基本上 take 的就是說你要開哪一個檔案,那個名字是什麼。
那你的模式是什麼?以及你的這個檔案的 所謂的 encoding,encoding 我們之前有介紹過。
那 所以呢,這個名字自然就是一個字串喏,就是說是這個檔案的路徑。
然後 呢,它的這個傳回值呢,這個 file variable
這個東西哦 它事實上呢,我們通常把它叫做一個 file handler。
那你會說什麼是 file handler 呢?file handler 的意思是說呢,其實是這個東西,好。
就是說杯子的這個杯緣是一個所謂的 handler。
那 handler 是幹嘛 是來拿被子的,對不對?所以檔案的 handler 是幹嘛的?就是來拿檔案處理檔案用的。
好,那如果說呢,你是要處理文字檔 你要讀寫文字檔的話,你是模式會這個 r 或者是 w。
然後,看你是要讀檔還是寫檔,好,就是這個模式的部分。
那你如果是所謂的 非文字當的話,你就是後面加一個 b。
比如說 rb 或者 wb 啦。
好,大概是這樣子。
然後呢,這個 encoding 呢,就是說我們現在 一般來說就是用 UTF-8
比較多啦,然後這個 所以一個簡單的例子,就是這個樣子,假設你是要讀
一個這個二進位的資料檔,然後呢,你就是 open;然後這邊是檔
對不對?然後你說你是要二進位的檔案,然後是要讀。
然後呢,你 就會得到一個 infile 這個東西,那這個就是一個所謂的 file
handler,那這個東西我們後續就可以拿來 用這個東西去把資料讀進來。
那 所以呢,我們就來看一個比較具體一點的例子。
那我們先從文字檔開始,因為文字檔是 這個可能是最好理解,而且比較蠻常遇到的
一個狀況,那所以我們要準備一個檔案叫 risk.txt,它是一個文字檔。
好,然後呢,你就把它這個下載下來哦,擺到一個
你想要擺的地方哦,然後呢,這個 這個文字檔的內容大概長這個樣子,好,長這個樣子。
它基本上第一行就寫這個什麼 competition among platforms ecosystems, and devices。
那這個檔案事實上是從微軟這個的這個 2017 的年報 的某個段落 copy
過來的,它裡面就是講說它的一些微軟這家公司面臨的風險。
這裡面就是有 這個我們當然就是沒有全部都 copy 啦,好。
這個檔案裡面有 比較完整的內容,到這邊我們就把它 cut 掉了,好。
那,所以它就是一個文字檔。
然後呢,所以你如果第一步要開檔 剛剛有講,對不對?那你如果說呢,你如果要開一個這個
Python 的 console 你把這一行打進去哦 大部分的人可能會廢哦,除非你運氣非常好。
那你說我現在要開一個檔案,然後檔名是叫 risk.txt
我要拿來寫檔,然後呢 這個 open 之後的這個結果,我把它放到 filehandler1
對不對? 好,那一般來說呢,你如果這樣做的話,大概有很高的機會你會廢哦。
你如果真的也可以開檔的話,你就把你那個 risk.txt 哦,把它 搬到別的地方去,你就會廢哦。
哈哈哈哈,那這個 那它這個廢物的原因,你會發現它說 FileNotFoundError,它說找不到檔案。
找不到檔案,這個原因我想這個也不會那麼難理解,因為你現在說這個 檔案叫
risk.txt 你並沒有給它一個這個完整的路徑,那它當然會廢掉哦。
那 它基本上就是,它 complian 的事情就是 說,就是 Python 找不到檔案嘛。
那 這事怎麼辦呢?所以我們來稍微地介紹一下這個檔案的存取哦。
檔案的存取有一個 很重要的觀念叫做絕對路徑,那絕對路徑這個東西哦,就寫在這裡哦。
Full path 或者是 absolute path 或者有人叫絕對路徑,然後絕對路徑的指的是就是說它是一個唯一
可以識別一個檔案的路徑,那這個東西就是是不會變的,它擺在那裡,你用這個
路徑去指定它,就一定會到那個地方,那你如果用絕對路徑的話
的做法就是說呢,你看你擺在哪裡哦。
那你要從,比如說你在Windows 上的話呢
你是在哪一個槽開始,然後呢一層一層地往下去指定它的路徑,比如說在這邊就是 F
槽的 這個 ptt module 2018\什麼 py23,對不對。
然後下面才是 然後呢,這個是 folder,然後呢再加上 risk
.txt 這就是你的這個 整個這個檔案的完整的一個路徑,好。
那如果你是在這個 Linux 下的話,你就沒有這個槽了,對不對。
你可能就是寫這一邊,比如說 ptt/ 對不對,好。
然後呢,比如說是 risk .txt 之類的,好,大概是這樣子。
那 那所以這個大家可能有發現說,欸,這個不同的
作業系統,它這個指定路徑的方式可能是不大一樣的。
好,那所以我們就大概說一下,就是說如果你是用 Windows
的作業系統的話呢,Windows 是使用這個所謂的這個反斜線
來這個來指定這個檔案的路徑。
那 如果是其他作業系統,比如說是 Mac 或者是這個 Linux 的話呢,它是用這個斜線。
那所以這個斜線跟反斜線是不一樣的哦。
這個是所謂的這個 demand curve 這個是 supply curve,好,不一樣的東西。
那 這個反斜線呢這個誰選的?這個就是當初這個很早期的時候 DOS 作業系統選的。
那你說 DOS 作業系統為什麼會那個?老實說我也不知道。
你可能要去問比爾蓋茨,他可能比較清楚一點。
那他為什麼要跟別人不一樣呢?因為他那個時候還年輕吧,哈哈。
那這個所以 Backslash 呢,它事實上這是一個
有一點麻煩的做法啦,就是說其實你要選什麼字元去在
代表你的路徑這是一回事,但是你選 backslash 的時候,它真的有一個副作用。
它的副作用 是什麼呢?就是 backslash 在一般的程式語言裡,它是有特殊意義的。
那 backslash 是有所謂的 "escape character" 的意思。
那你問說什麼叫做 "escape character"?"escape character" 直翻 叫做逃脫字元,escape 是逃脫嘛。
然後呢,什麼叫做逃脫字元呢?逃脫字元是說呢 如果你看到 backslash
的話,backslash 的下一個字元是有特殊意義的。
好,所以這個叫做逃脫字元,就是跳脫出它這個 本來的意思的那個意思。
那 所以呢,我們來看一個例子。
就是比如說呢,你現在我們知道說 在
Python 裡面你要定義一個字串的時候,你可以用雙引號或者用單引號,那假設我們現在就是用
我們就是要用雙引號來定義一個字串,但是我們字串裡面又有雙引號; 那就會有問題,對不對?但是這個
"escape character" 可以幫你做這個事情。
怎麼說呢,就可以就是說在字串裡面的這個雙引號的部分,前面加一個 backslash
這樣子呢,Python 就知道說 backslash
後面接的這個雙引號呢,它事實上就不是這個字串的 這個結束,而是這個只是一個單純的雙引號。
好,這個就是 typically 你看到這個 "escape character" 的用途。
所以呢,你看比如說你這樣定義的話,印出來的話,它就是裡面是有一個
有雙引號的字串,而且你定義這個字串的時候是用雙引號來定義的。
那 你也可以試試看你如果沒有 "escape character" 的話,那這個敘述就會有問題。
這個就不會是一個這個合法的一個敘述。
那 這個東西跟我們的這個路徑有什麼關係呢,所以我們就來看一下哦。
如果說你是在 Windows 裡面的話,你要指定一個這個絕對路徑的話,你就會遇到所謂的這個 backslash。
好,backslash 叫做反斜線。
那所以呢, 這時候呢,但是我們又知道說這個反斜線呢是
有特殊意義的,所以呢,你為了要處理掉這件事情的話呢,你就必須要把這個反斜線
把它重複一次,所以說就是變成用兩個反斜線來代表一個這個只是 真的是一個反斜線的一個字元。
那這樣子,你如果用兩個 連續的反斜線的話,這個反斜線就不會被解釋成 "escape
character",就會被解釋成一般的一個反斜線 的字元而已。
那所以呢,我們來看一下 這個如果你不用反斜線跟你用反斜線會有什麼差別?
好,所以比如說我們現在定義的這個字串叫 fn0,suppose 它就是我們檔案的
這個絕對路徑,那我們說它是 F:\ ppt module 2 2018\risk.txt,好。
那你如果看這個東西哦,你如果這個有
稍微這個有注意一下,發現這個斜線它的顏色不一樣了,為什麼斜線它的顏色不一樣了?- 是因為哦
backslash r 是有特殊意義的,backslash r 在字串的定義裡面,它是所謂的歸位字元。
歸位字元的意義是說,它是會讓你回到這個 這個這一行的第一個字。
那 所以呢,你把它印出來的時候,就會發生一個狀況。
就是說它 印到 2018 之後,它會歸位,歸位了之後再從第一行 印 isk.txt。
那你如果說把這個反斜線用兩個反斜線來
替換的話,就不會有這個問題,你的結果就會是正確的結果,你定義出來的路徑就會是正確- 的路徑。
好,那所以你看這個 fn0 印出來的話,它會是前面都
是看起來蠻正常的哦,然後但是到這個 2018 之後呢 r 不見了,只剩
isk.txt,這個原因就是因為 backslash r 它是一個特殊意義的 一個字元。
那你如果說呢,用兩個 backslash 來做這個事情的話,就不會有這個問題, 對不對?好。
這個整個這個絕對路徑就會是正確的絕對路徑,好。