一般來說,我們都會把資料儲存在檔案中。如果我們想要分析資料的時候,必須先將資料從檔案中取出並且讀取它。因此,我們可以透過撰寫Python程式碼來取出檔案並且讀取檔案裡面的資料,作為分析資料的前置準備。
如何在預先設定的資料夾中產生一個檔案?
如果想要打開電腦裡面的檔案,只需要下幾行Python程式碼,就可以開啟檔案。
透過下面程式,我們可以在預先建立的in資料夾裡面建立一個檔案testing.txt。
其中open表示開啟檔案,而該檔案的路徑在電腦的 in/testing.txt,這裡使用 in/而不是/in/表示我的python 檔案與in資料夾在同一個層級,你也可以已照您的需要使用不一樣的電腦路徑。
另外,”w”表示寫入模式。(還有“r”與“a”等分別代表不一樣模式的參數可以選擇 )
myfile = open("in/testing.txt", "w")
執行上面的程式後,可以去in資料夾裡面檢查是否已經產生了一個testing.txt檔案,如果檔案存在的話,就表示已經成功了。
然後,在用下面程式關閉檔案。
可見,Python是一個簡潔的程式語言。接下來,我們進一步來看這幾個程式碼所代表的意思。
open()函數
open函數是內建的函數。如前面展示,open函數可以開啟指定的檔案,並對檔案進行接下來的讀取或修改寫入等行為。
如果想知道open函數的所有功能,可以在終端機輸入help(open)。如下所示,你可以看到open可以使用的八種參數:
open(file, mode='r', buffering=-1, encoding=None,
errors=None, newline=None, closefd=True, opener=None)
open函數最簡單的用法是讀取檔案,你只要透過下面語法就可以讀取檔案:
open("file")
其中的filename,就是檔案名稱,如果檔案與程式不在同一個資料夾目錄的話,需要寫上檔案路徑。路徑可以是相對路徑也可以是絕對路徑。
open("file","mode")
mode可以決定檔案開啟的模式,模式有下面幾種:
- 讀取(r)。
- 寫入(w)。如果要寫入的檔案尚未存在,就會建立一個檔案,如果已經存在了,就會覆蓋原來的內容。
- 寫入(x)。只有在檔案尚未存在時,才可以寫入。
- 增添模式(a)。如果檔案存在時,會在檔案結尾處寫入添加的訊息。
以上幾種模式還可以配合另一組字母t與b,組合成不同的效果:
例如 rt表示讀取文字檔案,rb表示讀取二進位檔案。
如果省略不寫的話,系統將預設為讀取模式。上面的例子中沒有設定mode模式,就是讀取模式。
read()
會從目前的游標位置讀取指定長度的字元,如果未特別指定長度,則為讀取所有的字元。
例如:
myfile.read()
上面這一行會讀取所有字元
myfile.read(5)
上面這一行則會讀取前5個字元
close()
myfile.close()
關閉檔案,檔案關閉之後就不可以再進行檔案的讀寫作業。在使用write()函數時,如果沒有在後面寫上close()的話,寫入的資料不會存入檔案中。使用close()函數也可以釋放記憶體。
write()
我們要如何在檔案中輸入文字?很簡單,只要使用write() 方法就可以實現,如下:
file.write("this is my first line")
那麼,我們可以輸入中文字嗎?
file.write("這是第一行文字")
你可能會出現下面的錯誤訊息。這是因為編碼的問題。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
前面提到,open函數有八種參數可以使用,其中encoding可以指定程式讀取檔案的編碼。指定正確的檔案編碼可以避免發生類似上面讀取錯誤的狀況。由於國際間通行的編碼為utf-8,我們一般使用的文字大都會存成此種編碼,因此建議使用utf-8作為encoding的值。
open("file","mode",encoding="編碼值")
所以在這裡,我們必須在open()開啟檔案時加上 encoding="utf-8”。上面的程式碼應該改寫為:
file = open("in/testing.txt", "w", encoding="utf-8")
file.write("這是第一行文字")
總結來說,write 函數能將指定的字串寫入檔案中。如果原本已經有檔案的話,就會清除檔案中的資料,再把字串寫入。
下面是另外一個例子。下面程式把 Miki 寫入 file/employees.txt 裡面,如果 file 資料夾裡面沒有employees.txt 檔案的話,就會自行建立一個 employees.txt 檔案,再把 Miki 寫入。如果已經有employees.txt 檔案的話,就會清除檔案中的資料,再把 Miki 寫入。
myfile = open("file/employees.txt", "w")
myfile.write("Miki")
myfile.close()
增加文字
目前為止,我們使用的模式都是"w"。使用”w”寫入文字的話,會把原來已經在檔案中的內容全部清除,並且替換為新的文字。有時候這不是你希望的使用情境,你可能會想在原來的文字後面加上新的文字內容而不想覆蓋到原來內容時該如何處理?
使用”a”參數
使用”a”參數的話,可以在原來的文字後面加上新的文字內容而不覆蓋到原來的內容。如果我想在Miki後面加入一行Jack的話,首先我們可以先把mode改成a。然後再透過.write()函數寫入檔案。
不過需要注意的是,在Jack前面有一個『\n 』的符號,這是個換行符號,可以讓Jack換到下一行。
myfile = open("file/employees.txt", "a")
myfile.write("\nJack")
myfile.close()
seek()
當我們在讀寫的時候,Python會追蹤目前檔案所在的位置。seak()函數可以讓你將指標移動文件最前端,你也可以seak()到最後一個,並且只讀取一個byte。
readline()與readlines()
使用read()時,一次可以讀取整個檔案,如果檔案太大的話,可能會佔掉你大半的記憶體。你可以提供最大字元數量,來限制read()每次會傳的數量。例如:每次只限於讀取100個字元。
readline()會每次讀入一行,並回傳一串單行字串。
readlines()類似read(),讀取所有行數,會傳為一個串列(list)
透過With開啟檔案
如果透過with 來開啟檔案的話,就不需要再透過close()來關閉檔案。用法如下:
with open("in/testing.txt", "w") as file:
file.write("this is with method")
接下來,我們來看看這個問題要如何透過with解決。
假設我們有下面一組串列。
mylist=["A3","\nA4","\nA5","\nA6"]
如何把這組串列中的文字,逐行列出,並且儲存在一個文字檔案(mylist.txt)中?
解決方法如下:
mylist=["A3","\nA4","\nA5","\nA6"]
with open("in/mylist.txt", "w") as file:
for item in mylist:
file.write(item)
我們可以透過for迴圈,將mylist串列中的資料逐一寫入mylist.txt檔案中。透過with的方式,
程式碼變得更加簡潔,我們不需要在後面寫上close()來關閉檔案。
留言
張貼留言