1. 程式人生 > >python程式設計:從入門到實踐學習筆記-檔案和異常

python程式設計:從入門到實踐學習筆記-檔案和異常

從檔案中讀取資料

讀取檔案、檔案路徑

#pi_digits.txt
3.1415926535
   8979323846
   2643383279

#file_reader.py
fillename = 'pi_digits.txt'

#讀取整個檔案
with open(filename) as file_object:
    contents = file_object.read()
    print(contents.rstrip())

#逐行讀取
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

執行結果:
3.1415926535
   8979323846
   2643383279
3.1415926535
   8979323846
   2643383279

函式open():接受要開啟檔案的檔名作為引數。如果沒有指定路徑,則在當前執行的檔案所在的目錄中查詢指定的檔案。此函式返回一個表示檔案的物件。
關鍵字with:表示在不需要訪問檔案之後將其關閉。
函式read():用於從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。到達檔案末尾時返回一個空字串(空行)。列印時可使用函式rstrip()刪掉。
相對檔案路徑:相對於當前執行的程式所在目錄。
絕對檔案路徑:完整的檔案路徑。

建立包含檔案各行內容的列表並使用
使用關鍵字with時,open()返回的檔案物件只在with程式碼塊內使用。如果要在with程式碼塊外訪問檔案內容,可在裡邊將檔案各行儲存在一個列表中待後續使用。

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

執行結果:3.141592653589793238462643383279
32

注意:讀取文字檔案時,python將其中所有文字都解讀穩字串。

寫入檔案

將文字寫入檔案時,呼叫open()時需要提供另外一個實參。其中,第一個實參時要開啟的檔案的名稱。第二個實參是指定的模式:讀取模式('r')、寫入模式('w')、附加模式('a')、讀取和寫入模式('r+'。如果省略將以預設的只讀模式開啟檔案。
如果寫入的檔案不存在,則open()會自動建立它。如果以寫入模式開啟檔案且指定檔案物件存在,則返回檔案物件前會清空改檔案。

filename = 'programming.txt'

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

執行結果:
programming.txt
I love programming.I love programming.
I love creating new games.

注意:python只能將字串寫入文字檔案。函式write()不會在寫入的文字末尾新增換行符。

附加到檔案
如果要寫入檔案並不覆蓋,可以使用附加模式。寫入的行都會新增到檔案末尾。指定檔案不存在時,自動建立。

filename = 'programming.txt'

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 programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

異常

異常時python用來管理程式執行期間發生錯誤的特殊物件。
異常是使用try-except程式碼塊處理的。如果try程式碼塊中的程式碼執行無誤,則跳過except程式碼塊;如果try程式碼塊中的程式碼執行出現錯誤,則執行except程式碼塊

print(5/0)

執行結果:
Traceback (most recent call last):
    File "division.py", line 1, in <module>
        print(5/0)
ZeroDivisionError: division by zero

ZeroDivisionError是一個異常物件。

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

執行結果:
You can't divide by zero!

使用try-except程式碼塊也可以隱藏Traceback,防止惡意攻擊等等。
除了try-except程式碼塊還有try-except-else程式碼塊。其中try程式碼塊只包含可能導致錯誤的程式碼,而依賴於其成功執行的程式碼都放在else程式碼塊中。
如果希望發生錯誤時繼續執行,可以在except程式碼塊中使用pass語句pass語句還充當了佔位符,用來提醒我們在程式的某個地方什麼都沒有做。

儲存資料

模組json可以讓我們將簡單的python資料結構轉儲到檔案中,並在程式再次執行時載入該檔案中的資料。並且還可以使用json在python程式中分享資料。

函式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
[2, 3, 5, 7, 11, 13]

函式json.load()載入儲存在指定檔案物件的資訊。

import json
filename = 'numbers.json'

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

執行結果:
[2, 3, 5, 7, 11, 13]

下面將存取資料和異常結合一下程式執行時,從檔案獲取使用者名稱,若檔案不存在,則提示輸入使用者名稱並存儲:

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

執行結果:
#如果檔案不存在
What is your name? Eric
We'll remember you when you come back, Eric!

#如果檔案存在
Welcome back, Eric!