Python編程從入門到實踐——文件和異常


文件操作

讀取文件數據

通過使用 open() 函數打開文件進行文件操作,將文件中的信息讀取到內存中。例如如下例子:

保存一個 pi_digits.txt 的文本文件,具體內容如下:

3.1415926535
8979323846
2643383279

創建一個如下內容的Python文件,命名爲 file_reader.py ,代碼內容如下:

with open("pi_digits.txt") as file_object:
	contents = file_object.read()
	print(contents)

運行結果如下:

在這裏插入圖片描述
如果擔心結尾會有多餘的回車,可以在打印時對內容進行去除尾部空白處理,使用 rstrip() 函數方式進行處理,修改後代碼如下:

with open("pi_digits.txt") as file_object:
	contents = file_object.read()
	print(contents.rstrip())

按行讀取文件數據,可以如下使用:

filename = 'pi_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))

執行結果如下:

在這裏插入圖片描述

簡單實例——在圓周率中尋找你的生日

讀取圓周率前一百萬位,在其中判斷是否包含你的生日,打印查找結果,具體代碼如下:

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()
    
pi_string = ""

for line in lines:
    pi_string += line.strip()
    
birthday = input("Enter your birthday, in the form mmddyy:")
if birthday in pi_string:
    print("Your birthday appears in the first million digits of pi!")
else:
    print("Your birthday does not in the first million digits of pi!")

運行結果如下:

在這裏插入圖片描述

寫入文件數據

寫入單行數據

保存數據最簡單的方式就是將其寫入文件中。通過將輸出寫入到文件中即可保證數據不會輕易丟失,並且在後續需要使用的時候還能通過讀取文件再將數據讀取到內容中繼續進行處理。

要將文本寫入到文件中,需要在調用 open() 函數時提供一個實參,以告訴Python需要寫入打開的文件,例如下面的操作:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

在上面的例子中,調用 open() 時提供了兩個實參,第一個實參就是需要打開或者創建的文件的名稱(包含絕對路徑或者相對路徑的名稱);第二個實參( 'w' )表示將以寫入模式打開這個文件。在打開文件時,可指定讀取模式( 'r' )、寫入模式( 'w' )、附加模式( 'a' )或可以讀取和寫入的模式( 'r+' )。如果省略了這個參數,那麼Python將以默認的只讀模式打開文件。

在使用 w 寫入模式打開文件時,如果文件不存在將自動創建它。

寫入多行數據

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love create new games.")

附加寫入數據

採用 w 寫入模式在打開文件時會將文件原有數據清空或者覆蓋,如果只是希望在文件原有的內容後追加數據,需要使用 a 附加模式打開文件。當使用附加模式打開文件時,Python 不會再返回文件對象前情況文件,而後面寫入的數據會添加到文件的末尾,如果指定的文件不存在也會自動進行創建。

具體示例代碼如下:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love create new games.\n")
    
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 create new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

異常

Python 使用被成爲異常的特殊對象來管理程序執行期間發生的錯誤。每當發生讓 Python 不知所措的錯誤時,它都會自動創建一個異常對象。如果恰好編寫了處理該異常的代碼,那麼程序就會進行運行;而如果沒有對異常進行處理,程序將停止並顯示一個 traceback ,其中包含有關異常的報告。

異常是使用 try-except 代碼塊處理的。 try-except 代碼塊讓 Python 執行指定的操作,同時告訴 Python 發生異常時怎麼辦。使用了 try-except 代碼塊時,即便出現了異常,程序也將繼續運行:顯示編寫的友好的錯誤處理消息而不是程序停止後顯示的 traceback 。

具體事例如下:

  • 不使用 try-except 代碼塊處理的代碼:
print(5/0)

在這裏插入圖片描述

  • 使用 try-except 處理後:
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':
        break
    second_number = input("\nSecond number:")
    if second_number == 'q':
        break
    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can't divide by 0!")
    else:
        print(answer)
        

在這裏插入圖片描述

使用多個文件實例

def count_words(filename):
    '''計算一個文件大概含有多少個單詞'''
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except FileNotFoundError:
        msg = "Sorry, the file " + filename + " does not exit."
        print(msg)
    else:
        # 計算文件大概包含多少個單詞
        words = contents.split()
        num_words = len(words)
        print("The file " + filename + " has about " + str(num_words) + " word.")
        
filename = "alice1.txt"
count_words(filename)

執行結果如下:

在這裏插入圖片描述

JSON 模塊存儲數據

模塊 JSON 能夠將簡單的 Python 數據結構轉移存儲到文件中,並在程序再次運行時加載此文件中的數據。使用 JSON 在 Python 程序之間分享數據很是方便。更重要的是, JSON 數據各式並不是 Python 專用的,所以使用 JSON 格式轉儲數據也同時可以與其他編程語言編寫的程序進行交互使用。

使用 JSON

下面是使用 JSON 模塊進行數據寫入和數據讀取的實例:

使用 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 文件的內容如下:

在這裏插入圖片描述
使用 json.load() 進行數據讀取:

import json

filename = 'numbers.json'

with open(filename) as f_obj:
    numbers = json.load(f_obj)
    
print(numbers)

執行結果如下:

在這裏插入圖片描述

保存、讀取用戶數據

以下實例中,程序將從 username.json 文件中獲取用戶數據並使用。

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 + "!")

執行結果如下:

在這裏插入圖片描述

並且,上面實例可以進行優化,具體優化後如下:

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()

執行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章