從文件中讀取數據
讀取整個文件
讀取整個文件 要讀取文件,需要一個包含幾行文本的文件。下面首先創建一個文件,它包含精確 到小數點后30位的圓周率值,且在小數點后每10位處換行:
pi_digits.txt?
3.141592653589793238462643383279
Python方法rstrip() 刪除字符串末尾的空白。
文件路徑
將類似于pi_digits.txt的簡單文件名傳遞給函數open() 時,Python將在當前執行 的文件(即.py程序文件)所在的目錄中查找。 根據你組織文件的方式,有時可能要打開不在程序文件所屬目錄中的文件。
由于文件夾text_files位于文件夾python_work中,可以使用相對文件路徑來打開其 中的文件。相對文件路徑讓Python到指定的位置去查找,而該位置是相對于當前運 行的程序所在目錄的。
with open('text_files/filename.txt') as file_object:
這行代碼讓Python到文件夾python_work下的文件夾text_files中去查找指定的.txt 文件。
注意 顯示文件路徑時,Windows系統使用反斜杠(\ )而不是斜杠(/ ), 但在代碼中依然可以使用斜杠。
file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:
還可以將文件在計算機中的準確位置告訴Python,這樣就不用關心當前運行的程序 存儲在什么地方了。這稱為絕對文件路徑 。
逐行讀取
讀取文件時,常常需要檢查其中的每一行:可能要在文件中查找特定的信息,或者 要以某種方式修改文件中的文本。
創建一個包含文件各行內容的列表
使用關鍵字with 時,open() 返回的文件對象只在with 代碼塊內可用。如果要 在with 代碼塊外訪問文件的內容,可在with 代碼塊內將文件的各行存儲在一個列表中,并在with 代碼塊外使用該列表:可以立即處理文件的各個部分,也可以推遲到程序后面再處理。
使用文件的內容
filename = 'pi_digits.txt'with open(filename) as file_object:lines = file_object.readlines()
pi_string = ''
for line in lines:pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))raw_input()
包含一百萬位的大型文件
filename = 'pi_million_digits.txt'
with open(filename) as file_object:lines = file_object.readlines()
pi_string = ''
for line in lines:pi_string += line.strip()
print(f"{pi_string[:52]}...")
print(len(pi_string))
二.寫入文件
寫入空文件
保存數據的最簡單的方式之一是將其寫入文件中。通過將輸出寫入文件,即便關閉 包含程序輸出的終端窗口,這些輸出也依然存在:可以在程序結束運行后查看這些 輸出,可以與別人分享輸出文件,還可以編寫程序來將這些輸出讀取到內存中并進行處理。
filename = 'programming.txt'
with open(filename, 'w') as file_object:file_object.write("I love programming.")
第一個實參也是要打開的文 件的名稱。第二個實參('w' )告訴Python,要以寫入模式 打開這個文件。打開文 件時,可指定讀取模式 ('r' )、寫入模式 ('w' )、附加模式 ('a' )或讀 寫模式 ('r+' )。如果省略了模式實參,Python將以默認的只讀模式打開文件。
注意 Python只能將字符串寫入文本文件。要將數值數據存儲到文本文件中, 必須先使用函數str() 將其轉換為字符串格式。
寫入多行
filename = 'programming.txt'
with open(filename, 'w') as file_object:file_object.write("I love programming.\n")file_object.write("I love creating new games.\n")
要讓每個字符串都單獨占一行
附加到文件
如果要給文件添加內容,而不是覆蓋原有的內容,可以以附加模式 打開文件。以附 加模式打開文件時,Python不會在返回文件對象前清空文件的內容,而是將寫入文 件的行添加到文件末尾。如果指定的文件不存在,Python將為你創建一個空文件。
filename = 'programming.txt'
with open(filename, 'a') as file_object:file_object.write("I love programming.\n")file_object.write("I love creating new games.\n")
三.異常
"""
Python使用稱為異常的特殊對象來管理程序執行期間發生的錯誤。每當發生讓
Python不知所措的錯誤時,它都會創建一個異常對象。如果你編寫了處理該異常的代碼,
程序將繼續運行;如果未對異常進行處理,程序將停止并顯示traceback,其中包含有關異常的報告。
"""
try:print(5/0)
except ZeroDivisionError:print("You can't divide by zero!")
"""
使用try-except代碼塊
"""print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")while True:first_number = input("\nFirst number: ")if first_number == 'q':breaksecond_number = input("Second number: ")if second_number == 'q':breaktry:answer = int(first_number) / int(second_number)except ZeroDivisionError:print("You can't divide by 0!")else:print(answer)
"""
Python嘗試執行try 代碼塊中的
代碼,只有可能引發異常的代碼才需要放在try 語句中。有時候,有一些僅在try
代碼塊成功執行時才需要運行的代碼,這些代碼應放在else 代碼塊中。
"""
四.存儲數據
模塊json 讓你能夠將簡單的Python數據結構轉儲到文件中,并在程序再次運行時 加載該文件中的數據。你還可以使用json 在Python程序之間分享數據。更重要的 是,JSON數據格式并非Python專用的,這讓你能夠將以JSON格式存儲的數據與使用 其他編程語言的人分享。
- JSON(JavaScript Object Notation)格式最初是為JavaScript開發 的,但隨后成了一種常見格式,被包括Python在內的眾多語言采用。
使用json.dump() 和json.load()
編寫一個存儲一組數的簡短程序,再編寫一個將這些數讀取到內存中的程 序。第一個程序將使用json.dump() 來存儲這組數,而第二個程序將使用 json.load() 。 函數json.dump() 接受兩個實參:要存儲的數據,以及可用于存儲數據的文件對象。
number_writer.py
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f:json.dump(numbers, f)
保存和讀取用戶生成的數據
使用json 保存用戶生成的數據大有裨益,因為如果不以某種方式存儲,用戶的信 息會在程序停止運行時丟失。
import json
username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f:json.dump(username, f)print(f"We'll remember you when you come back, {username}!")
'''
What is your name? Eric
We'll remember you when you come back, Eric!
'''
import jsonfilename = 'username.json'with open(filename) as f:username = json.load(f)print(f"Welcome back, {username}!")
"""
使用json.load() 將存儲在username.json中的信息讀取到變量
username 中。恢復用戶名后,就可以歡迎用戶回來了
"""
'''
Welcome back, Eric!
'''
import json# 如果以前存儲了用戶名,就加載它。# 否則,提示用戶輸入用戶名并存儲它。
filename = 'username.json'
try:with open(filename) as f:username = json.load(f)
except FileNotFoundError:username = input("What is your name? ")with open(filename, 'w') as f:json.dump(username, f)print(f"We'll remember you when you come back, {username}!")
else:print(f"Welcome back, {username}!")
重構
import json
def get_stored_username():"""如果存儲了用戶名,就獲取它。"""filename = 'username.json'try:with open(filename) as f:username = json.load(f)except FileNotFoundError:return Noneelse:return username
def greet_user():"""問候用戶,并指出其名字。"""username = get_stored_username()if username: print(f"Welcome back, {username}!")else:username = input("What is your name? ")filename = 'username.json'with open(filename, 'w') as f:json.dump(username, f)print(f"We'll remember you when you come back, {username}!")
greet_user()
"""
代碼能夠正確地運行,但通過將其劃分為一系列完成具體工作的函數,還可以改進。這樣的過程稱為重構。
重構讓代碼更清晰、更易于理解、更容易擴展。要重構remember_me.py,
可將其大部分邏輯放到一個或多個函數中。
remember_me.py的重點是問候用戶,因此將其所有代碼都放到一個名為
greet_user() 的函數中
"""