檔案讀取
讀取整個檔案
- 要讀取檔案,需要一個包含幾行文本的檔案。下面首先來建立一個檔案,它包含精确到小數點後30位的圓周率值,且在小數點後每10位處都換行:
pi_digits.txt
3.1415926535
8979323846
2643383279
下面的程式打開并讀取這個檔案,再将其内容顯示到螢幕上:
file_reader.py
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
- 在這個程式中,用open()函數打開這個與file_reader.py同目錄的檔案pi_digits.txt并且open()函數傳回一個檔案對象.
- with: 不再需要通路檔案時将其關閉.
- 有了這個檔案對象之後,使用方法read()讀取這個檔案并儲存在contents裡面
- 檔案顯示出來會有多一個空行,因為到達檔案末尾時傳回一個空字元串,而将這個空字元串顯示出來時就是一個空行。
檔案路徑
- 相對路徑與絕對路徑
- 相對路徑 :
- 當你将類似pi_digits.txt這樣的簡單檔案名傳遞給函數open() 時,Python将在目前執行的檔案(即.py程式檔案)所在的目錄中查找檔案。
-
: 這行代碼的意思時從與代碼相同檔案夾的地方先找到text_files再找到filename.txt,同樣也是相對路徑with open('text_files/filename.txt') as file_object:
- 絕對路徑
-
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
-
就像這樣直接給出檔案在系統中的路徑.with open(file_path) as file_object:
逐行讀取檔案
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
結果将是:
3.1415926535
8979323846
2643383279
在這個檔案中,每行的末尾都有一個看不見的換行符,而print 語句也會加上一個換行符,是以每行末尾都有兩個換行符:一個來自檔案,另一個來自print 語句,是以會有空白行
逐行讀取并儲存在清單中
filename = 'pi_digits.txt'
with open(filename) as file_object:
❶ lines = file_object.readlines()
❷ for line in lines:
print(line.rstrip())
- ❶處的方法readlines() 從檔案中讀取每一行,并将其存儲在一個清單中;接下來,該清單被存儲到變量lines 中;在with 代碼塊外,我們依然可以使用這個變量。在❷處,我們使用一個簡單的for 循環來列印lines 中的各行。由于清單lines 的每個元素都對應于檔案中的一行,是以輸出與檔案内容完全一緻。
寫入空檔案
demo:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
- 打開檔案時,可指定讀取模式 (‘r’ )、寫入模式 (‘w’ )、附加模式 (‘a’ )或讓你能夠讀取和寫入檔案的模式(‘r+’ )。如果你省略了模式實參,Python将以預設的隻讀模式打開檔案。
- 如果你要寫入的檔案不存在,函數open() 将自動建立它。然而,以寫入(‘w’ )模式打開檔案時千萬要小心,因為如果指定的檔案已經存在,Python将在傳回檔案對象前清空該檔案。
- 我們使用檔案對象的方法write() 将一個字元串寫入檔案。
- 注意 Python隻能将字元串寫入文本檔案。要将數值資料存儲到文本檔案中,必須先使用函數str() 将其轉換為字元串格式。
寫入多行
- 函數write() 不會在你寫入的文本末尾添加換行符,是以如果你寫入多行時沒有指定換行符,檔案看起來可能不是你希望的那樣:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love creating new games.")
- 如果你打開programming.txt,将發現兩行内容擠在一起:
I love programming.I love creating new games.
- 要讓每個字元串都單獨占一行,需要在write() 語句中包含換行符:
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将為你建立一個空檔案。
異常
-
Python使用被稱為異常 的特殊對象來管理程式執行期間發生的錯誤。每當發生讓Python不知所措的錯誤時,它都會建立一個異常對象。如果你編寫了處理該異常的代碼,程式将繼續運作;如果你未對異常進行處理,程式将停止,并顯示一個traceback,其中包含有關異常的報告。
異常是使用try-except 代碼塊處理的。try-except 代碼塊讓Python執行指定的操作,同時告訴Python發生異常時怎麼辦。使用了try-except 代碼塊時,即便出現異常,程式也将繼續運作:顯示你編寫的友好的錯誤消息,而不是令使用者迷惑的traceback。
使用try-except 代碼塊
demo:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
儲存資料
- 使用子產品JSON
- 使用json.dump()和json.load()
- 函數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)
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)