Python入門學習系列——Python文件和異常


從文件中讀取數據

首先准備一個文本文件,文件中存儲着普通文本數據。讀取文件需要調用open()和read()函數。

讀取整個文件

代碼示例:

with open('pi_digits.txt') as file_object: contents=file_object.read() print(contents)
open()函數

在讀取文件之前,必須先要打開文件,這樣才能訪問它。打開文件需要調用open()函數,它接受一個參數:要打開的文件路徑名稱(可以是相對路徑,也可以是絕對路徑,相對路徑時,Python將會以當前執行的文件所在的目錄作為相對位置去查找指定的文件)。

注意:在Linux和OS X中,使用斜杠(/)分割文件路徑;而在Windows系統中,使用反斜杠(\)分割文件路徑。

函數open()返回一個表示文件的對象。例如此處的open('pi_digits.txt') 返回一個表示文件pi_digits.txt的對象,Python將這個對象存儲在我們將在后面使用的變量file_object中。

with關鍵字

關鍵字with在不再需要訪問文件后將其關閉。它可以解決顯式調用close()函數可能出現的一些問題,如果顯式的調用close()函數,一旦程序出現異常,導致close()語句還未執行,文件將不會關閉,而且如果過早的調用close(),將會出現文件讀取錯誤,因此使用with關鍵字可以很好的避免這類問題,Python讓你只管打開文件,並在需要時使用它,Python自會在合適的時候自動將其關閉。

另外還需要注意一點,使用關鍵字with時,open()返回的文件對象只在with代碼塊內可用。

read()函數

如果不給read()函數傳遞參數,將會讀取全部內容。

注意:read()讀取到文件末尾時會返回空白符(文本的末尾有一個看不見的換行符),為了去除多余的空白,應該結合使用rstrip()函數:

#去除字符串末尾的多余空白 print(contents.rstrip())

逐行讀取

#逐行讀取 with open('pi_digits.txt') as file_object2: for line in file_object2: print(line.rstrip())

可以直接使用for循環遍歷文件對象,去讀取每一行。

創建一個包含文件各行內容的列表

使用關鍵字with時,open()返回的文件對象只在with代碼塊內可用,可以先將讀取的內容放入一個列表中,然后在with代碼塊的外面去訪問文件的內容。

#創建包含文件各行內容的列表 with open('pi_digits.txt') as file_object3: #從文件中讀取每一行,並將其存儲在一個列表中 lines=file_object3.readlines() #在with代碼塊的外面讀取該列表 for line in lines: print(line.rstrip())

將數據寫入文件

將數據寫入到文件中,需要調用open()和write()函數。

寫入空文件

filename='test.txt' #寫入空文件 with open(filename,'w') as file_obj: file_obj.write('hello python!')

寫入文件時,也需要使用open()函數先打開文件,不同的是打開文件的模式不同。open()函數的第一個參數用來指定文件名,第二個參數指定打開的模式,相關模式如下:

  • 寫入模式(w):如果文件不存在,將會創建一個空文件。如果文件已經存在,將會在返回該文件對象前清空該文件。即永遠以空文件的形式返回文件對象,不管該文件是否有數據。
  • 讀取模式(r):如果open()函數省略了模式實參,將默認以該模式打開文件,即文件只能讀取不能寫入。
  • 附加模式(a):不清空原文件,而是將新寫入的內容附加到原文件的末尾。如果文件不存在,將會創建一個空文件,並附加內容。
  • 讀取和寫入模式(r+

使用open()寫入文件時,如果文件不存在,將會自動創建它。

寫入多行

#寫入多行 with open(filename,'w') as file_obj2: file_obj2.write('java \n') file_obj2.write('python \n')

write()函數不會在你寫入的文本末尾添加換行符,因此寫入多行時,需要手動的在字符串的末尾添加換行符(\n)。

附加到文件

#附加到文件 with open(filename,'a') as file_obj3: file_obj3.write('one \n') file_obj3.write('two \n')

以附加模式打開文件時,python不會在返回文件對象前清空文件,而是將要寫入到文件的內容追加到原文件的末尾。如果指定的文件不存在,將創建一個空文件,並附加內容。

異常

Python在程序執行期間發生錯誤時,都會創建一個異常對象,如果不做處理,將會顯示一個Traceback,其中包含有關異常的報告。為了處理異常,在Python中的異常使用try-except代碼塊處理。廈門叉車價格多少錢

使用try-except代碼塊

當你認為可能發生錯誤時,可以編寫try-except代碼塊來處理可能引發的異常。代碼塊格式如下:

try: 可能會發生異常的代碼片段 except 異常對象: 異常處理的代碼片段

例如,捕捉被除數為0引發的ZeroDivisionError異常對象:

try: print(5/0) except ZeroDivisionError: print('被除數不能為0')

try-except-else代碼塊

else代碼塊不是必須的,它只有在需要依賴於try代碼塊成功執行時才需要。它在try-except中的結構位置如下:

try: 片段1 except 異常對象: 片段2 else: 片段3

try-except-else代碼塊的工作原理:python嘗試執行try代碼塊中的片段1代碼,片段1的代碼應該是只有可能引發異常的代碼,不會引發異常的代碼不要放在try代碼塊中(片段1)。如果片段1的代碼發生了異常,就執行片段2的代碼進行異常處理,否則,如果片段1的代碼沒有發生異常,就執行片段3的代碼,片段3的代碼應該是僅在片段1的代碼成功執行時才需要運行的代碼。

while True: first_num=input("第一個數:") if first_num=='q': break second_num=input('第二個數:') try: result=int(first_num)/int(second_num) except ZeroDivisionError: print('被除數不能為0') else: print('值為:'+str(result))

使用pass關鍵字在拋出異常時不做任何處理

如果在捕獲到異常時,並不想寫任何處理操作,可以直接在片段2的代碼中,使用pass關鍵字。

try: 片段1 except 異常對象: pass

pass語句還充當了占位符,它提醒你在程序的某些對方什么都沒有做,並且以后也許要在這里做些什么。

處理FileNotFoundError異常

使用文件讀寫操作時,如果文本名錯誤或文件不存在,就會拋出異常。此時,可以通過捕獲FileNotFoundError異常對象進行處理。

filename='alice.txt' try: with open(filename) as f_obj: contents=f_obj.read() except FileNotFoundError: print('文件找不到!')

附加:存儲JSON格式數據到文件中

需要導入json模塊來存儲數據,然后調用json.dump()和json.load()分別存儲和讀取JSON數據。

使用json.dump()來存儲數據

#導入json模塊 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.load()來讀取數

import json filename='numbers.json' with open(filename) as f_obj: #讀取數據 numbers=json.load(f_obj) print(numbers)


免責聲明!

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



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