1. 程式人生 > 其它 >python基礎知識——檔案和異常

python基礎知識——檔案和異常

1. 讀檔案

1.1 讀取整個檔案

  • with open('a.txt') as f1:
        contents = f1.read()
        print(contents)

    a.txt檔案位於程式所在的目錄中

    關鍵字with在不再需要訪問檔案後將其關閉,使用with可以使你只負責開啟檔案,並在需要時使用它,python自會在合適的時候自動將其關閉

  • 傳遞給函式open()的引數可以是相對路徑,如with open(‘files/a.txt’) as f1:,相對路徑是相對於當前執行程式所在的目錄
  • 傳遞給函式open()的引數可以是絕對路徑,如下所示
  • path = 'D:\Python\codes\pi_digits.txt
    ' with open(path) as f1: contents = f1.read() print(contents)

1.2 逐行讀取

  • filename = 'pi_digits.txt'
    
    with open(filename) as f1:
        for line in f1:
            print(line)

    執行結果

    3.14159265357979
    
       32384626433832
    
       79
  • 列印每一行時,因為每行末尾都有一個換行符,print語句也會加上一個換行符,因為每行末尾都有兩個換行符,要消除這些多餘的空白行,可在print語句中使用rstrip()函式,如print(line.rstrip())

1.3 建立一個包含檔案各行內容的列表

  • 使用關鍵字with時,open()返回的檔案物件只在with程式碼塊內可用
  • 若要在with程式碼塊外訪問檔案的內容,可在with程式碼塊內將檔案的各行儲存在一個列表中,並在with程式碼塊外使用該列表
  • filename = 'pi_digits.txt'
    
    with open(filename) as f1:
        lines = f1.readlines()
    
    for line in lines:
        print(line.rstrip())

    readlines()方法從檔案中讀取每一行,並將其儲存在一個列表中,該列表被儲存到變數lines中

2. 寫檔案

  • 呼叫open()時提供了兩個實參,第二個實參可以是'r'讀取模式,'w'寫入模式,'a'附加模式,'r+'讀取和寫入,若省略,則預設以只讀模式開啟檔案
  • python只能將字串寫入文字檔案,要將數值資料儲存到文字檔案中,必須先使用函式str()將其轉換為字串格式
  • 函式write()不會在寫入的文字末尾自動新增換行符,所以可以手動新增空格、製表符或空行來設定輸出的格式
  • 若要給檔案新增內容,而不是覆蓋原有內容,可以附加模式開啟檔案
  • filename = 'pi_digits.txt'
    
    with open(filename, 'a') as f1:
        f1.write("\nI love programming.")

3. 異常

3.1 使用異常

  • python使用被稱為異常的特殊物件來管理程式執行期間發生的錯誤
  • 若編寫了處理異常的程式碼,程式將繼續執行;若未對異常進行處理,程式將停止,並顯示一個traceback,其中包含有關異常的報告
  • 異常是使用try-except程式碼塊處理的,使用try-except程式碼塊之後,即使出現異常,程式也將繼續執行
  • try:
        print(5/0)
    except ZeroDivisionError:
        print("You can't divide by zero!")

    執行結果

    You can't divide by zero!
  • else程式碼塊:依賴於try程式碼塊成功執行的程式碼都放到else程式碼塊中
  • try-except-else程式碼塊的工作原理大致如下:python嘗試執行try程式碼塊中的程式碼(只有可能引發異常的程式碼才需要放在try語句中),若發生了except指定的異常,則執行except程式碼塊;若try程式碼塊成功執行,則執行else程式碼塊
  • print("Give me two numbers, and I'll divide them.")
    print("Enter 'q' to quit.")
    
    while True:
        first = input("\nFirst number: ")
        if first == 'q':
            break
        second = input("Second number: ")
        if second == 'q':
            break
        try:
            answer = int(first) / int(second)
        except ZeroDivisionError:
            print("You can't divide by 0!")
        else:
            print(answer)

3.2 處理FileNotFoundError異常

  • def count_words(filename):
        '''計算一個檔案大致包含多少個單詞'''
        try:
            with open(filename) as f1:
                contents = f1.read()
        except FileNotFoundError:
                msg = "Sorry, the file " + filename + " does not exist."
                print(msg)
        else:
            #計算檔案大致包含多少個單詞
            words = contents.split()
            num = len(words)
            print("The file " + filename + " has about " + str(num) + " words.")
    
    filenames = ['a.txt', 'pi_digits.txt']
    for filename in filenames:
        count_words(filename)

    執行結果

    Sorry, the file a.txt does not exist.
    The file pi_digits.txt has about 8 words.

3.3 發生錯誤時直接略過

  • 我們並非每次在捕獲到異常時都告知使用者,有時你希望程式在發生異常時什麼也不做
  • python有一個pass語句,可在except程式碼塊中使用pass告訴python發生異常時什麼都不要做
  • except FileNotFoundError:
                pass

4. 儲存資料

4.1 使用json.dump()和json.load()

  • 下面演示瞭如何使用json.dump()來儲存數字列表
  • import json
    
    numbers = [2, 3, 5, 7, 11]
    
    filename = 'numbers.json'
    with open(filename, 'w') as f1:
        json.dump(numbers, f1)

    程式執行之後,檔案numbers.json的內容為

    [2, 3, 5, 7, 11]
  • 下面演示瞭如何使用json.load()將這個列表讀取到記憶體中
  • import json
    
    filename = 'numbers.json'
    with open(filename) as f1:
        numbers = json.load(f1)
    
    print(numbers)

    執行結果為

    [2, 3, 5, 7, 11]

5. 重構

  • 重構——將程式碼劃分為一系列完成具體工作的函式
  • 重構使程式碼更清晰,更易於理解,更容易擴充套件