從文件中讀取數據
首先准備一個文本文件,文件中存儲着普通文本數據。讀取文件需要調用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)