python程式設計:從入門到實踐學習筆記-檔案和異常
從檔案中讀取資料
讀取檔案、檔案路徑
#pi_digits.txt 3.1415926535 8979323846 2643383279 #file_reader.py fillename = 'pi_digits.txt' #讀取整個檔案 with open(filename) as file_object: contents = file_object.read() print(contents.rstrip()) #逐行讀取 with open(filename) as file_object: for line in file_object: print(line.rstrip()) 執行結果: 3.1415926535 8979323846 2643383279 3.1415926535 8979323846 2643383279
函式open()
:接受要開啟檔案的檔名作為引數。如果沒有指定路徑,則在當前執行的檔案所在的目錄中查詢指定的檔案。此函式返回一個表示檔案的物件。
關鍵字with
:表示在不需要訪問檔案之後將其關閉。
函式read()
:用於從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。到達檔案末尾時返回一個空字串(空行)。列印時可使用函式rstrip()
刪掉。
相對檔案路徑:相對於當前執行的程式所在目錄。
絕對檔案路徑:完整的檔案路徑。
建立包含檔案各行內容的列表並使用
使用關鍵字with
時,open()
返回的檔案物件只在with
程式碼塊內使用。如果要在with
程式碼塊外訪問檔案內容,可在裡邊將檔案各行儲存在一個列表中待後續使用。
filename = 'pi_30_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
執行結果:3.141592653589793238462643383279
32
注意:讀取文字檔案時,python將其中所有文字都解讀穩字串。
寫入檔案
將文字寫入檔案時,呼叫open()時需要提供另外一個實參。其中,第一個實參時要開啟的檔案的名稱。第二個實參是指定的模式:讀取模式('r'
)、寫入模式('w'
)、附加模式('a'
)、讀取和寫入模式('r+'
)。如果省略將以預設的只讀模式開啟檔案。
如果寫入的檔案不存在,則open()
會自動建立它。如果以寫入模式開啟檔案且指定檔案物件存在,則返回檔案物件前會清空改檔案。
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
執行結果:
programming.txt
I love programming.I love programming.
I love creating new games.
注意:python只能將字串寫入文字檔案。函式write()
不會在寫入的文字末尾新增換行符。
附加到檔案
如果要寫入檔案並不覆蓋,可以使用附加模式。寫入的行都會新增到檔案末尾。指定檔案不存在時,自動建立。
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")
執行結果:
programming.txt
I love programming.I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.
異常
異常時python用來管理程式執行期間發生錯誤的特殊物件。
異常是使用try-except
程式碼塊處理的。如果try
程式碼塊中的程式碼執行無誤,則跳過except
程式碼塊;如果try
程式碼塊中的程式碼執行出現錯誤,則執行except
程式碼塊。
print(5/0)
執行結果:
Traceback (most recent call last):
File "division.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
ZeroDivisionError
是一個異常物件。
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
執行結果:
You can't divide by zero!
使用try-except
程式碼塊也可以隱藏Traceback,防止惡意攻擊等等。
除了try-except
程式碼塊還有try-except-else
程式碼塊。其中try
程式碼塊只包含可能導致錯誤的程式碼,而依賴於其成功執行的程式碼都放在else
程式碼塊中。
如果希望發生錯誤時繼續執行,可以在except
程式碼塊中使用pass
語句。pass
語句還充當了佔位符,用來提醒我們在程式的某個地方什麼都沒有做。
儲存資料
模組json可以讓我們將簡單的python資料結構轉儲到檔案中,並在程式再次執行時載入該檔案中的資料。並且還可以使用json在python程式中分享資料。
函式json.dump()
接受兩個實參:要儲存的資料以及可用於儲存資料的檔案物件。
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
執行結果:
numbers.json
[2, 3, 5, 7, 11, 13]
函式json.load()
載入儲存在指定檔案物件的資訊。
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
執行結果:
[2, 3, 5, 7, 11, 13]
下面將存取資料和異常結合一下程式執行時,從檔案獲取使用者名稱,若檔案不存在,則提示輸入使用者名稱並存儲:
import json
# 如果以前儲存了使用者名稱就載入它
# 否則提示使用者輸入使用者名稱並存儲它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
執行結果:
#如果檔案不存在
What is your name? Eric
We'll remember you when you come back, Eric!
#如果檔案存在
Welcome back, Eric!