Python小白入門:第九講|


Python小白入門:第九講||文件和異常

在這一講中,你將學習:
如何使用文件;
如何一次性讀取整個文件,以及如何以每次一行的方式讀取文件的內容;
如何寫入文件,以及如何將文本附加到文件末尾;
什麼是異常以 及如何處理程序可能引發的異常;
如何存儲Python數據結構,以保存用戶提供的信息,避免用戶每次運行程序時都需要重新提供。

為什麼要學習文件和異常處理呢?

學習處理文件和保存數據可讓你的程序使用起來更容易:

用戶將能夠選擇輸入什麼樣的數據,以及在什麼時候輸入;

用戶使用你的程序做一些工作後,可將程序關閉,以後再接著往下做。

學習處理異常可幫助你應對文件不存在的情形,以及處理其他可能導致程序崩潰的問題。

9.1 從文件中讀取數據

文本文件中可以存儲各種各樣的信息,當你需要瀏覽或修改文件信息的時候,就需要讀取文件。

要使用文本文件中的信息,首先要將信息讀取到內存中。讀取的方式有兩種:第一種可以一次性讀取全部內容,第二種時以每次一行的方式逐步讀取。

9.1.1讀取整個文件

首先我們創建一個名為:file.txt 的文本文件,注意文件和我們的程序文件保存在一個文件夾中,不能在子文件夾中。

這裡解釋一下:假如我們的程序文件存儲在Python_work這個文件夾中,而Python_work中有一個子文件夾file_work,我們的file.txt文件就保存在其中,這樣的保存路徑暫時是不可以的。

後面我再講如何訪問別的路徑(非程序所在文件夾)中的文件。

我們在file.txt中敲一串數字:123456789

<code>with open('file.txt') as file_object:
contents = file_object.read()
print(contents)/<code>

我們來分析代碼:

函數open()接受一個參數:要打開文件的名稱。python在當前執行的文件所在的目錄中查找指定文件。這就是為什麼剛開始需要把文件和程序文件保存在一個目錄下的原因。隨後含糊返回一個表示文件file.txt的對象,並把這個對象存儲在一個變量中。

關鍵字with在不需要訪問文件後將其關閉。其實我們可以調用close來關閉文件,但是如果程序出現錯誤(bug)導致文件不能再合適的時候關閉,造成的後果無法想象,尤其是對大公司來說,可能導致數據的丟失。我們在這裡所展示的結構就不需要考慮這個問題,Python會在合適的時候關閉文件。

輸出

<code>123456789
/<code>

後面會多一個空行,因為read()到達文件末尾時返回一個空字符,將這個空字符展示出來就是一個空行。要刪除空行,可使用rstrip()。

9.1.2

下面我們介紹之前提到的如何具體訪問一個其他位置的文件。

1.假如file.txt存儲在程序文件所在的子文件夾中,即file.txt存儲在子文件夾file_work 中,我們可以使用相對文件路徑來訪問它。

windows系統下這樣訪問。

<code>with open('file_work\\file.txt') as file_object:/<code>

如果你的系統是Mac 或者 Linux ,這樣來訪問。

<code>with open('file_work/file.txt') as file_object:/<code> 

2.你還可以將文件的在計算機中的準確位置告訴Python,這樣,無論文件保存在哪,都可以訪問。這樣的訪問方式稱為絕對文件路徑訪問。

你可以將文件路徑存儲在一個變量中,再將變量傳遞給函數open(),這樣更方便。

<code>file_path = 'C:Users\\other_file\\Python_work\\file_work\\file.txt'\\
with open('file_path') as file_object:/<code>

9.1.3 逐行讀取

逐行讀取其實只需要一個for循環即可。

<code>with open('file.txt') as file_object:
for line in file_object:
print(line)/<code>

你只需要重新一下文件file.txt,多寫幾行數字。

輸出時你會發現就是一行一行輸出,但是每行中間都有一行空字符串。想去掉,只需在print中調用rstrip()

<code>with open('file.txt') as file_object:
for line in file_object:
print(line.rstrip())/<code>

9.1.4 創建一個包含文件各行內容的列表

使用關鍵字with時,open()返回的對象只能在with代碼塊中用。如果要想在with以外使用文件內容,就需要將文件的每行內容存儲在一個列表中,在需要的時候訪問列表即可。

<code>with open('file.txt') as file_object:
lines = file_object.readlines()

for line in lines:
print(line.rstrip())/<code>

9.1.5使用文件內容

將文件讀取到內存中後,就可以以任意方式使用文件中的數據了。

只需要創建一個變量,然後將文件內容存儲進去即可

9.2寫入文件

保存數據最簡單的方法就是將它寫入文件中。

9.2.1 寫入空白文件

要將文本寫入文件,你在調用open()時需要提供另一個實參,告訴Python你要寫入打開的文件。

<code>file_name = 'file.txt'
with open('file_name', 'w') as object:
file_object.write("I love you")/<code>

這裡我們向函數open()傳遞了兩個參數,第一個參數是文件的名稱,第二個實參告訴Python我們要以寫入模式打開文件。打開文件時,可指定 讀取模式('r') 寫入模式('w') 附加模式('a') 讀取和寫入模式('r+')。如果省略模式參數,Python默認以只讀方式打開文件。

要想寫入多行文件,你只需要再次調用write()即可,但注意字符串末尾加上換行符/n,如果沒有,文件就會以一行的方式寫入。

如果要想給文件添加內容,而保留原先的數據,就可以使用附加模式。

9.3 異常

Python使用被稱之為異常的特殊對象來管理程序執行期間發生的錯誤。

每當程序出現錯誤時,不管這個錯誤是什麼,他都會創建一個異常對象。如果你編寫了該異常的代碼,程序將繼續運行;如果沒有編寫,程序將停止,並顯示一個Traceback,告訴你程序出錯的原因。

異常是使用try-except代碼塊處理的。它讓Python執行指定的操作,即使發生錯誤,程序也將繼續運行,同時告訴你應該怎麼辦。而不是你看不懂的Traceback反饋。

9.3.1 處理ZeroDivisonError異常

什麼時候會導致這種異常呢 ?

<code>print(5/0)/<code>

我知道不能用一個數除以0,Python卻不知道,它會返回一個異常對象

<code>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero/<module>/<stdin>/<code>

在這種情況下Python停止運行,並指出引發了哪種異常。

下面我們告訴Python,發生了這種異常該怎麼辦,如果再次發生,我們就有備無患了。

9.3.2 使用try-except代碼塊

<code>try:
print(5/0)
except ZeroDivisonError:
print("You can't divide by zero")/<code>

代碼分析:

如果try代碼塊中的代碼運行成功,Python將跳過except代碼塊;如果運行失敗,將執行except代碼塊中的代碼。

很顯然,這個程序將運行except中代碼。

輸出

<code>You can't divide by zero/<code>

你可以在你覺得程序將會出現異常的地方使用try-except代碼塊。

如果程序找不到指定文件,會反饋FileNotFoundError異常,要想處理FileNotFoundError異常,也可以使用try-except代碼塊。

如果你在發生異常時,並不希望程序反饋給你信息,可使用pass,讓Python什麼都不做。

<code>try:
print(5/0)
except ZeroDivisonError:
pass/<code>

如果try代碼塊運行成功,這時候你要輸出結果,可以用else代碼塊

<code>try:
a = 1
b = 2
c = a + b
except ZeroDivisonError:
pass
else:
print(c)/<code>

9.4 存儲數據

很多程序要求用戶輸入某種信息,程序把用戶輸入的信息存儲在列表和字典等數據結構中,如果你想在程序關閉時保存這些信息,可以使用json模塊來存儲數據。

9.4.1 使用json.dump()和 json.load()

我們首先編寫一個存儲數字的程序,這裡需要用到json.dump()

<code>import json

numbers = [1, 2, 3, 4, 5]

fielname = 'numbers.json'
with open(filename, 'w') as file_object:
json.dump(number, file_object)/<code>

代碼分析:

我們先導入了模塊json,在創建一個數字列表。我們指定了要將該數字列表存入的文件名稱,使用後綴名.json規定了文件格式。我們以寫入模式打開這個文件,使用函數json.dump()將數字列表存儲到文件中。

下面我們再編寫一個程序,讀取這個文件到內存中,這裡使用json.load()

<code>import json

numbers = [1, 2, 3, 4, 5]

fielname = 'numbers.json'
with open(filename) as file_object:
number = json.dump(file_object)
print(number)/<code>


分享到:


相關文章: