python基礎知識——檔案和異常
阿新 • • 發佈:2021-07-25
1. 讀檔案
1.1 讀取整個檔案
-
with open('a.txt') as f1: contents = f1.read() print(contents)
a.txt檔案位於程式所在的目錄中
關鍵字with在不再需要訪問檔案後將其關閉,使用with可以使你只負責開啟檔案,並在需要時使用它,python自會在合適的時候自動將其關閉
- 傳遞給函式open()的引數可以是相對路徑,如with open(‘files/a.txt’) as f1:,相對路徑是相對於當前執行程式所在的目錄
- 傳遞給函式open()的引數可以是絕對路徑,如下所示
-
path = 'D:\Python\codes\pi_digits.txt
1.2 逐行讀取
-
filename = 'pi_digits.txt' with open(filename) as f1: for line in f1: print(line)
執行結果
3.14159265357979 32384626433832 79
- 列印每一行時,因為每行末尾都有一個換行符,print語句也會加上一個換行符,因為每行末尾都有兩個換行符,要消除這些多餘的空白行,可在print語句中使用rstrip()函式,如print(line.rstrip())
1.3 建立一個包含檔案各行內容的列表
- 使用關鍵字with時,open()返回的檔案物件只在with程式碼塊內可用
- 若要在with程式碼塊外訪問檔案的內容,可在with程式碼塊內將檔案的各行儲存在一個列表中,並在with程式碼塊外使用該列表
-
filename = 'pi_digits.txt' with open(filename) as f1: lines = f1.readlines() for line in lines: print(line.rstrip())
readlines()方法從檔案中讀取每一行,並將其儲存在一個列表中,該列表被儲存到變數lines中
2. 寫檔案
- 呼叫open()時提供了兩個實參,第二個實參可以是'r'讀取模式,'w'寫入模式,'a'附加模式,'r+'讀取和寫入,若省略,則預設以只讀模式開啟檔案
- python只能將字串寫入文字檔案,要將數值資料儲存到文字檔案中,必須先使用函式str()將其轉換為字串格式
- 函式write()不會在寫入的文字末尾自動新增換行符,所以可以手動新增空格、製表符或空行來設定輸出的格式
- 若要給檔案新增內容,而不是覆蓋原有內容,可以附加模式開啟檔案
-
filename = 'pi_digits.txt' with open(filename, 'a') as f1: f1.write("\nI love programming.")
3. 異常
3.1 使用異常
- python使用被稱為異常的特殊物件來管理程式執行期間發生的錯誤
- 若編寫了處理異常的程式碼,程式將繼續執行;若未對異常進行處理,程式將停止,並顯示一個traceback,其中包含有關異常的報告
- 異常是使用try-except程式碼塊處理的,使用try-except程式碼塊之後,即使出現異常,程式也將繼續執行
-
try: print(5/0) except ZeroDivisionError: print("You can't divide by zero!")
執行結果
You can't divide by zero!
- else程式碼塊:依賴於try程式碼塊成功執行的程式碼都放到else程式碼塊中
- try-except-else程式碼塊的工作原理大致如下:python嘗試執行try程式碼塊中的程式碼(只有可能引發異常的程式碼才需要放在try語句中),若發生了except指定的異常,則執行except程式碼塊;若try程式碼塊成功執行,則執行else程式碼塊
-
print("Give me two numbers, and I'll divide them.") print("Enter 'q' to quit.") while True: first = input("\nFirst number: ") if first == 'q': break second = input("Second number: ") if second == 'q': break try: answer = int(first) / int(second) except ZeroDivisionError: print("You can't divide by 0!") else: print(answer)
3.2 處理FileNotFoundError異常
-
def count_words(filename): '''計算一個檔案大致包含多少個單詞''' try: with open(filename) as f1: contents = f1.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) else: #計算檔案大致包含多少個單詞 words = contents.split() num = len(words) print("The file " + filename + " has about " + str(num) + " words.") filenames = ['a.txt', 'pi_digits.txt'] for filename in filenames: count_words(filename)
執行結果
Sorry, the file a.txt does not exist. The file pi_digits.txt has about 8 words.
3.3 發生錯誤時直接略過
- 我們並非每次在捕獲到異常時都告知使用者,有時你希望程式在發生異常時什麼也不做
- python有一個pass語句,可在except程式碼塊中使用pass告訴python發生異常時什麼都不要做
-
except FileNotFoundError: pass
4. 儲存資料
4.1 使用json.dump()和json.load()
- 下面演示瞭如何使用json.dump()來儲存數字列表
-
import json numbers = [2, 3, 5, 7, 11] filename = 'numbers.json' with open(filename, 'w') as f1: json.dump(numbers, f1)
程式執行之後,檔案numbers.json的內容為
[2, 3, 5, 7, 11]
- 下面演示瞭如何使用json.load()將這個列表讀取到記憶體中
-
import json filename = 'numbers.json' with open(filename) as f1: numbers = json.load(f1) print(numbers)
執行結果為
[2, 3, 5, 7, 11]
5. 重構
- 重構——將程式碼劃分為一系列完成具體工作的函式
- 重構使程式碼更清晰,更易於理解,更容易擴充套件