天天看點

預備小菜:Python入門之操作檔案

作者:馬拉松程式員

檔案的讀寫操作是資料分析經常遇到的場景,也是常見的I/O(Input/Output)場景。我們常用的一般是excel檔案、txt檔案、csv檔案。單個的txt或者csv檔案是比單個excel檔案儲存的行數多。不過Excel目前最大的支援的行數是1048756行,對于剛開始接觸資料分析的人來說,是完全足夠了,如果有成千萬甚至上億的資料時,會采用一些大資料相關的技術處理,并不是我們講述的重點,是以我們就先用txt檔案來示範一下,Python是如何讀取和寫入的。

讀取檔案

首先我們在電腦本地建立一個test.txt的檔案,檔案中寫入四行内容,如圖所示。

預備小菜:Python入門之操作檔案

然後我們開始讀取檔案,在Python中提供了一個内置函數open(),它用于打開一個檔案,建立一個file 對象,然後可以對file 對象進行讀取操作。

test = open('test.txt', 'r')
print(test.read())
#代碼結果:
hello
world
Python
資料分析           

上面open()函數中有兩個參數,第一個是檔案的名稱,可以使用相對路徑,也可以使用絕對路徑,如果使用相對路徑則需要目前代碼腳本檔案和讀取檔案同一級目錄,否則就是抛出一個FileNotFoundError的異常。

FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

第二個參是指的檔案的打開方式,比如隻讀,寫入或者追加等,如果不添加的話,預設是隻讀方式打開檔案。在Python中檔案打開方式多達10餘種,常用的打開方式如表所示。

打開方式 作用 功能描述
r 以隻讀方式打開檔案,檔案不存在則報錯
r+ 讀、覆寫寫 以讀寫方式打開檔案,檔案不存在則報錯
rb 以隻讀方式打開檔案讀取二進制資料,檔案不存在則報錯
rb+ 讀、覆寫寫 以讀寫方式打開檔案操作二進制資料,檔案不存在則報錯
w 以隻寫方式打開檔案,檔案存在則覆寫,不存在則建立
w+ 讀、覆寫寫 以讀寫方式打開檔案,檔案存在則覆寫,不存在則建立
wb 以隻寫方式打開檔案寫入二進制資料,檔案存在則覆寫,不存在則建立
wb+ 讀、覆寫寫 以讀寫的方式打開檔案寫入二進制資料,檔案存在則覆寫,不存在則建立
a 追加寫 追加内容,新寫的内容添加到已有内容之後,不覆寫,若檔案不存在則會建立檔案
a+ 讀、追加寫 讀寫内容,新寫的内容添加到已有内容之後,不覆寫,若檔案不存在則會建立檔案
ab 追加寫 追加二進制資料,新寫的内容添加到已有内容之後,不覆寫,若檔案不存在則會建立檔案
ab+ 讀、追加寫 讀寫二進制資料,新寫的内容添加到已有内容之後,不覆寫,若檔案不存在則會建立檔案

以上各種方式無法就是三個操作,讀r(read),寫w(write),追加a(append),如果帶b表示操作的是二進制資料,二進制表示的檔案在硬碟上存儲的資料原始的樣子。上面的示例使用二進制讀取是這樣的:

test = open("test.txt", 'rb')
print(test.read())
#代碼結果:
b'hello\nworld\nPython\n\xe6\x95\xb0\xe6\x8d\xae\xe5\x88\x86\xe6\x9e\x90'           

為什麼使用二進制的資料呢?因為圖檔或視訊檔案是不能用字元串方式來顯示,是以隻能用二進制的方式來讀寫,而且二進制資料可以跨平台使用。

寫入檔案

在上一個小節,我們看到了12種檔案打開方式用于讀寫操作,而且讀寫需要的mode不一樣,那如果用隻讀模式打開,進行寫操作會有什麼樣的結果呢?

test = open("test.txt", 'r')
word = '一個新字元串'
test.write(word)           

運作結果呢,不出意外,報錯

io.UnsupportedOperation: not writable

是以需要按照指定的檔案打開方式:

test = open("test.txt", 'w')
word = '一個新字元串'
test.write(word)           

這是打同級目錄下的test.txt檔案,發現隻有一行文字,就是我們新寫入的字元串。同樣如果是用寫的方式打開檔案,進行檔案的操作的時候也會同樣報io異常:not readable。

注意:檔案的寫操作,預設的編碼是系統編碼,而最常用的中文window系統預設的編碼格式是GBK,如果使用追加寫的方式,原來檔案内容字元編碼的不統一的話,會産生亂碼。是以有關寫的操作的時候,最好在open()時指定字元編碼,以免出現亂碼。

最後我們再看下append的方式是怎麼樣的,繼續使用上面的test.txt檔案,繼續寫入:

test = open("test.txt", 'a')
word = '又一個新字元串'
test.write(word)           

這時我們檢視一下text.txt檔案,檔案内容是:"一個新字元串又一個新字元串",可見“a”方式是實作了追加寫而不是覆寫寫。

不過以上三個示例的寫法并不規範,如果在代碼中打開了某個檔案,沒有釋放掉,其他的程式是無法操作檔案,是以需要在最後關閉檔案,而且在檔案操作時候還需要進行異常處理,是以完善的寫法應該是如下。

檔案操作完整寫法:

try:  
    test = open("test.txt", 'r', encoding="UTF8")  
    word = '又一個新字元串'  
    test.write(word)  
except Exception as e:  
    print("操作檔案異常:{}".format(e))  
finally:
test.close()           

如果每次操作檔案的時候需要寫try 捕獲異常,還需要釋放資源。這樣代碼顯得很備援,是以Python中還提供了一種方法就是with用法,會自動進行資源的擷取和釋放,用法也比較簡單易懂。

檔案操作完整寫法:

with open("test.txt", 'a', encoding="UTF8") as test:
word = '又一個新字元串'
test.write(word)           

with 語句實質是上下文管理,多用于檔案操作、資料庫連接配接操作等應用場景。

小結

多數情況下,操作的是excel檔案,而操作excel檔案會有很多專用的庫,例如openpyxl等,這些内容等到後面需要的再講到。

對于資料分析入門來講,Python的這些基礎知識就基本夠用,當然它不僅僅能做資料分析,還可以開發web,也支援面向對象的程式設計方式,語言的深度遠不止這些,感興趣的可以自行找一些學習資料,畢竟現在網上最不缺的就是老師。

預備小菜的章節到這裡就結束了,後面我們開始制作“大餐”。