Python(6)-文件和異常


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(),這個函數只負責獲取並存儲新用戶的用戶名。
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM