1.從文件中讀取數據
1.1讀取整個文件
舉例文檔file.txt內容如下:
3.1415926535
8979323846
2643383279
讀取文件:
with open('file.txt') as file_object:
contents = file_object.read()
print(contents.rstrip()) 刪除末尾的空行
輸出結果:
3.1415926535
8979323846
2643383279
函數open() 返回一個表示文件的對象。再用方法read()讀取這個文件的全部內容,並作為字符串存儲在變量contents中。
1.2文件路徑
假設文件存在Python工作目錄,text_files中,可用相對路徑(相對於當前運行的程序所在目錄)。
file_path = ’text_files/file.txt’ 注意根據系統,區別用反斜杠還是斜杠
with open(file_path) as file_object:
1.3逐行讀取
filename = ‘file.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
1.4創建一個包含文件各行內容的列表
filename = ‘file.txt'
with open(filename) as file_object:
lines = file_object.readlines() 用方法readlines()從文件中讀取每一行,並將其存儲在一個列表中;
for line in lines: for循環打印lines中的各行;
print(line.rstrip())
2.寫入文件
2.1寫入空文件
舉例如下:
filename = ‘file.txt'
with open(filename, 'w') as file_object: 讀取模式(‘r’)、寫入模式(‘w’)、附加模式(‘a’)、讀取和寫入模式(‘r+’),不傳參則是只讀模式;
file_object.write(“I like to learn.”) 方法write()將一個字符串寫入文件;
注意:Python只能將字符串寫入文本文件。要將數值數據存儲到文本文件中,必須先使用函數str()將其轉換為字符串格式。
2.2寫入多行
函數write()不會在你寫入的文本末尾添加換行符,因此如果寫入多行時沒有指定換行符,文件看起來可能不是希望的那樣。
filename = 'like.txt'
with open(filename, 'w') as file_object:
file_object.write("
I like to learn.\n”)
file_object.write("I like English.\n”) 需要加換行符,文件才會換行顯示;
2.3附加到文件
filename = 'like.txt'
with open(filename, 'a') as file_object: 用附加模式’a’;
file_object.write("I also like ...\n”) 會添加在之前文件后面;
3.異常
Python使用被稱為異常的特殊對象來管理程序執行期間發生的錯誤。每當發生讓Python不知所措的錯誤時,它都會創建一個異常對象。如果程序里編寫了處理該異常的代碼,程序將被繼續運行;如果程序里未對異常進行處理,程序將停止,並顯示一個traceback,其中包含有關異常的報告。
異常是使用try-except代碼塊處理的。try-except代碼塊讓Python執行指定的操作,同時告訴Python發生異常是怎么辦。使用了try-except代碼塊時,即便出現異常,程序也將繼續運行:顯示編寫的友好的錯誤消息。
3.1處理ZeroDivisionError異常
print(5/0) 數字除以0異常;
traceback如下:
Traceback (most recent call last):
File "file.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
3.2使用try-except代碼塊
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!”)
如果try代碼塊中的代碼運行起來沒問題,Python將跳過except代碼塊;如果try代碼中的代碼導致了錯誤,Python將查找這樣的except代碼塊,並運行其中的代碼,即其中指定的錯誤與引發的錯誤相同。
3.3處理FileNotFoundError異常
使用文件時,一種常見問題是找不到文件:你要查找的文件可能在其他地方、文件名可能不正確或者這個文件根本就不存在。
如下,是讀取同一個不存在文件的異常處理:
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist.”
print(msg)
3.4分析文本
>>> title = "Alice in Wonderland”
>>> title.split()
['Alice', 'in', 'Wonderland']
方法split()已空格為分隔符將字符串拆分成多個部分,並將這些部分都存儲到一個列表中。
如下,可以獲取文件的總字符有多少個:
filename = ‘alice.txt’
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist.”
print(msg)
else:
# 計算文件大致包含多少個單詞
words = contents.split() 調用split()方法,生成一個列表包含這個文件中的所有單詞;
num_words = len(words) len()來確定列表的長度,從而獲得文件的單詞數;
print("The file " + filename + " has about " + str(num_words) + " words.")
依賴於try 代碼塊成功執行的代碼,都會放到else 代碼塊中再使用。
4.存儲數據
用戶關閉程序時,總是要保存他們提供的一些信息,一種簡單的方式是使用模塊json來存儲數據。
模塊json讓你能夠將簡單的Python數據結構轉儲到文件中,並在程序再次運行時加載該文件中的數據。
4.1使用json.dump()和json.load()
(1)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) 使用函數json.dump()將數字列表存儲到文件中;
打開numbers.json文件,數據的存儲格式與Python的一樣([2, 3, 5, 7, 11, 13]).
(2)用json.load()將這個列表讀取到內存中
import json
filename = ‘numbers.json'
with open(filename) as f_obj: 用讀取方式打開文件;
numbers = json.load(f_obj) 使用函數json.load()加載存儲在文件中的信息,並將其存儲到變量numbers中;
print(numbers) 輸出數據:[2, 3, 5, 7, 11, 13]
4.2保存和讀取用戶生成的數據
程序啟用時,獲取用戶名:
import json
# 如果以前存儲了用戶名,就加載它
# 否則,就提示用戶輸入用戶名並存儲它
filename = ‘username.json'
try:
with open(filename) as f_obj: 嘗試打開文件username.json;
username = json.load(f_obj) 文件存在,將用戶名讀取到內存中,再執行else代碼塊;
except FileNotFoundError: 用戶首次運行這個程序時,文件username.json不存在,將引發FileNotFoundError異常,將執行except代碼塊;
username = input("What is your name? “) 提示輸入用戶名;
with open(filename, 'w') as f_obj: 使用json.dump()存儲該用戶名;
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!”)
else:
print("Welcome back, " + username + "!”)
4.3重構
代碼能夠正確地運行,但可以做進一步的改進-將代碼划分為一系列完成具體工作的函數,這樣的過程稱為重構。重構讓代碼更清晰、更易於理解、更容易擴展。
將上述例子重構:
import json
def get_stored_username():
"""如果存儲了用戶名,就獲取它”""
filename = ‘username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def get_new_username():
"""提示用戶輸入用戶名"""
username = input("What is your name? “)
filename = ‘username.json'
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
return username
def greet_user():
"""問候用戶,並指出其名字”""
username = get_stored_username()
if username:
print("Welcome back, " + username + "!”)
else:
username = get_new_username()
print("We'll remember you when you come back, " + username + "!")
greet_user()
每個函數都執行單一而清晰的任務。調用greet_user(),通過調用前面的兩個方法,實現要么歡迎老用戶回來,要么問候新用戶。首先調用get_stored_username(),這個函數只負責獲取存儲的用戶名(如果存儲了的話),再在必要時調用get_new_usernane(),這個函數只負責獲取並存儲新用戶的用戶名。