建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

什麼是檔案?

在計算機沒有被髮明出來之前,它通常以紙質的形式存在,透過文字和筆墨將人們口述或者大腦裡的想法記錄下來的實體。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

在記事本中編寫的手

檔案可以是竹簡、紙張、牛羊皮等等,它記錄了人類的智慧結晶和一切生產行為,如果沒有檔案存在並進行傳承,那整個人類的文明就無從談起了。

計算機和程式語言本質上就是人類的智慧結晶,高度抽象化的產物。

那麼在計算機中,檔案是如何產生並存在的呢?

我們都知道計算機中有兩個東西必不可少,記憶體和硬碟。

簡單的說我們在計算機中產生檔案其實就是將記憶體中的資料儲存到硬盤裡,

大家肯定在編寫文件的時候隨時選擇儲存防止資料丟失吧。

那你現在大概已經知道了當你敲擊鍵盤每次產生的資料都臨時放在記憶體中,直到你點選選單選擇儲存時計算機會將記憶體中的資料儲存到硬碟中。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

今天我們就來講講Python的檔案管理、物件序列化相關的內容。

透過本章的學習我們將掌握如何讀寫檔案,自定義檔案內容相關知識。

知識點:

Python檔案讀取、寫入、刪除

Python的物件序列化和反序列化

自定義nb檔案格式

Python檔案讀取

讓我們先來準備一個文字檔案並且寫一段程式碼來讀取它。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

首先我在電腦上寫了一個叫hello。txt的文字檔案並儲存了下來,其中有兩行內容。

f = open(‘hello。txt’, ‘r’)print(f。read())

現在我們來看看程式執行的結果。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

結果跟你想的一樣嗎?

透過這兩行行程式碼和輸出結果我們會學到幾個知識點。

Python裡透過

open()

內建函式開啟一個檔案,其中open()函式接收的第二個引數表示開啟檔案的模式,例如我只想讀取檔案,就傳一個

"r"

字元就行了,它是英文 read 的意思。

open()函式 開啟檔案後會得到一個 檔案物件,我們定義了一個變數f來接收它。

透過檔案物件的

read()

函式會獲取全部內容,由print() 函式打印出來。

關於檔案開啟模式這裡有一個表格,希望大家儲存記住,便於隨時查閱。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

現在我們再想想剛才的程式碼,其實有個缺陷,那就是我們能不能根據自己的需求一行一行的讀取檔案內容,而不是一下就把它列印了出來。

我們來看看如何讀取檔案的每一行內容吧。

f = open(‘hello。txt’, ‘r’)for i in f。readlines(): print(f“檔案內容:{i}”)

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

我們透過檔案物件的

readlines()

函式對檔案按行讀取內容,實際上readlines()函式會得到一個列表,列表裡的每個元素就是每一行的實際內容。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

透過以上例子我們可以發現readlines() 函式其實會獲得一個列表物件。

不過唯一有一點疑惑的就是為什麼“第一行”後面會多一個

"\n"

,而且它叫換行符,表示遇到它時就該換行了。

因為Python的print()函式在輸出內容時本來就會進行自動換行,所以我們會發現在之前的輸出結中。

檔案內容:第一行檔案內容:第二行

這個輸出檔案內容之間多了一個換行,其實就是這個 “\n” 換行符起了作用。

Python檔案寫入

瞭解了讀取檔案資訊,現在我們來看看怎麼用Python寫入檔案資訊的。

f = open(‘hello。txt’, ‘r+’)for x in range(1, 10): line_txt = f“第{x}行內容\n” f。write(line_txt)f。close()

現在來解讀一下程式碼。

我們用

"r+"

模式進行讀寫檔案

生成一個可迭代物件,從1迴圈到10

透過檔案物件的

write()

函式寫入檔案內容

寫入檔案完成後,透過檔案物件的close()函式關閉檔案,它的作用是關閉檔案物件,不再接受新的輸入資訊,這個時候如果再寫入檔案內容,程式就會報錯了,需要重新用open函式開啟檔案才能繼續寫入。

以下是hello。txt的內容,一共寫入了9行文字內容和最後一個空行“\n”。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

Python檔案刪除

關於如何刪除檔案,在Python裡有很多種方式,在這裡我們只介紹一種。

import osos。remove(檔名)

透過引入

os

這個Pyhton自帶的庫,我們可以完成很多跟檔案相關的操作,其中的

remove()

函式就是用來刪除檔案的,當我們remove()一個不存在的檔案或者資料夾時,程式就會會報錯。

Python的物件序列化

在講序列化之前先想想,我們的計算機裡除了剛才的 hello。txt 這類的txt文字檔案之外是不是還有 xls、png、avi、mp3等等各種型別的檔案格式?

它們是如何產生的?它們儲存的格式是怎麼樣的呢?

這些檔案的儲存格式不再是文字格式,而是位元組流資訊,換句話說就是二進位制資訊。

我們知道程式在執行時向記憶體申請資源,然後開始計算,將計算結果暫存在記憶體裡的各種物件裡。物件包括圖片資訊、影片資訊、電子表格資訊等等。

程式將物件透過二進位制的方式從記憶體儲存到硬碟檔案的過程就叫做序列化

本章的前言裡說到人類透過紙張將大腦裡的資訊用筆透過文字錄下來,變成了檔案。

那麼在計算機裡把物件序列化的這個過程其實就是人類用文字和筆記錄下來的過程。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

現在我們來試試Python怎麼進行物件序列化的。

import picklef = open(‘object_file’, ‘wb’)list1 = [1,2,3,4,5,6]pickle。dump(list1, f)

以上程式碼我們引用到了Python自帶的庫

pickle。

pickle是Python中專門用來做物件序列化操作的庫

透過它我們可以把物件進行序列化或者反序列化,簡單的說就是把物件儲存到檔案裡,或者從檔案裡直接讀取出物件資訊到程式裡。

而pickle的

dump()

函式的作用就是 將一個物件直接輸出到硬碟檔案裡。

現在回到程式碼裡來理解一下執行過程。

程式先是用

"wb"

的方式新建一個檔案,叫做 object_file。“wb” 模式表示寫入一個二進位制檔案。

建立了一個1-6的列表內容

透過dump()函式把物件直接寫入到檔案裡,dump()第一個引數是需要儲存的物件,第二個引數是需要儲存的檔案。

現在來看看我們寫入的檔案內容。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

兩個字,

看不懂!

因為我們用文字編輯器開啟的一個二進位制檔案,它無法識別這些二進位制檔案的內容。

對於初學者來說這就是一堆莫名其妙的符號。

那麼如何正確的解析這些資料呢?這個時候就需要用到

反序列化了

Python的物件反序列化

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

透過以上程式碼,我們利用pickle的

load()

函式進行反序列化,把剛才儲存在檔案裡的二進位制資訊又變成了列表物件了。

反序列化本身其實沒什麼好講的,它就是將檔案裡的資訊讀取出來並轉換為程式裡可用的物件,反序列化顧名思義就是它所做的事情和序列化的過程完全相反。

自定義nb檔案格式

現在我們瞭解了物件序列化的方法後,是不是可以發散思維。我們是不是可以自定義一種檔案格式,就叫它

nb

格式吧。

檔名看起來像這樣 111。nb、222。nb,然後這種檔案格式可以在螢幕上展示影象內容,當然這些影象內容如何展現都取決於我們自己。

具體流程如下(細節不用深究):

建立一種副檔名為nb的格式

透過Python現成的matplotlib庫來進行畫圖

定義圖片格式內容,簡單期間,我們就在螢幕上畫一條曲線

準備兩個列表,作為曲線的x和y座標資料,分別命名為x,y

現在我們來寫程式碼吧。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

透過以上10行程式碼,我們建立了一種新的檔案格式出來。

需要注意的是pickle。dump()可以多次寫入資料,每次寫入一個物件資訊。

現在我們看看寫入的111。nb檔案內容是什麼樣的。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

不出所料,111。nb是一堆二進位制的資料,現在我們需要寫程式來進行反序列化,解析它的內容了。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

來解讀一下上面的程式碼。

我們多引入了一個叫

matplotlib

的庫,利用到了它的

pyplot

模組來進行繪圖。

然後透過

"rb"

模式(二進位制檔案讀取)開啟111。nb檔案。

透過pickle的

load()

函式載入檔案裡的內容,並將其還原成Python裡的物件,用 x、y這兩個變數儲存起來。

這個還原的過程load()函式會自動幫我們完成,我們在現階段不需要關心它的原理,以後高階課程會講到。

load()函式同樣可以多次載入資料,直到檔案裡的所有物件全部讀出為止。

最後,我們透過pyplot模組繪製圖形。

pyplot.plot(x, y)

這行程式碼用於載入x、y的資訊,透過pyplot。show()將圖片顯示出來。

建立一個副檔名為nb的圖片,淺談Python的檔案管理和序列化操作

至此我們基本完成了一種名為nb檔案格式的設計,可能有人會問,那我直接把這個檔案傳給我的朋友,他開啟後會顯示圖片嗎?

當然不會!甚至在你的電腦上都不能夠直接顯示,你需要藉助剛才編寫的程式碼對其進行解析後才能夠顯示出來。

你想想如果你的電腦上不裝Excel或者Word,那麼xls表格檔案和doc文件可以開啟嗎?

像jpg、png、gif之類的檔案之所以能直接被開啟並顯示,原因是因為作業系統本身對其做了支援。

現在我們已經搞懂了如何利用Python的pickle生成自己想要的二進位制資訊並對其進行解析了,在以後可以利用它建立更多的自定義格式檔案出來。

在大多數情況下我們只會用到pickle的dump和load函式來做序列化相關的事情

使用pickle的注意事項

在使用pickle庫進行序列化的時候要注意最好不要用它來儲存大容量的物件資訊(例如1億個字串),如果有大容量資料的需求,可以選擇用別的庫來實現,pickle庫只是應對於常見情況。

同時也要注意在load時確保來源資料檔案是可信的,因為在load時Python會自動載入模組構造物件,如果攻擊者惡意製造一個破壞系統資訊的物件檔案,我們去load時就會有麻煩了。

總結

關於Pyhton檔案管理相關的基礎知識就講到這,透過本章的知識我們可以建立一些自定義內容的資料將其儲存起來,在網路上進行傳輸。

掌握好檔案管理相關的技能,才能更好的編寫實用性的Python程式碼,並幫助我們更好的工作。