天天看點

python學習筆記(六)---檔案操作與異常處理機制檔案讀取異常

檔案讀取

讀取整個檔案

  1. 要讀取檔案,需要一個包含幾行文本的檔案。下面首先來建立一個檔案,它包含精确到小數點後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裡面
  • 檔案顯示出來會有多一個空行,因為到達檔案末尾時傳回一個空字元串,而将這個空字元串顯示出來時就是一個空行。

檔案路徑

  • 相對路徑與絕對路徑
  1. 相對路徑 :
  • 當你将類似pi_digits.txt這樣的簡單檔案名傳遞給函數open() 時,Python将在目前執行的檔案(即.py程式檔案)所在的目錄中查找檔案。
  • with open('text_files/filename.txt') as file_object:

    : 這行代碼的意思時從與代碼相同檔案夾的地方先找到text_files再找到filename.txt,同樣也是相對路徑
  1. 絕對路徑
  • 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)