萌新向Python數據分析及數據挖掘 第一章 Python基礎 第十節 文件和異常
第一章 Python基礎
第十節 文件和異常
從文件中讀取數據
讀取文件、文件路徑
1 filename = ‘pi_digits.txt‘ #文件名取個代號 2 #讀取整個文件 3 with open(filename) as file_object: 4 contents = file_object.read()# 給內容取個代號 5 print(contents.rstrip()) 6 #逐行讀取 7 with open(filename) as file_object: 8 for line in file_object:#給一行內容取個代號View Code9 print(line.rstrip())
函數open()
:接受要打開文件的文件名作為參數。如果沒有指定路徑,則在當前執行的文件所在的目錄中查找指定的文件。此函數返回一個表示文件的對象。
關鍵字with
:表示在不需要訪問文件之後將其關閉。
函數read()
:用於從文件讀取指定的字節數,如果未給定或為負則讀取所有。到達文件末尾時返回一個空字符串(空行)。打印時可使用函數rstrip()
刪掉。
相對文件路徑:相對於當前運行的程序所在目錄。
絕對文件路徑:完整的文件路徑。
創建包含文件各行內容的列表並使用
使用關鍵字with
時,open()
返回的文件對象只在with
with
代碼塊外訪問文件內容,可在裏邊將文件各行存儲在一個列表中待後續使用。
1 filename = ‘pi_digits.txt‘ 2 with open(filename) as file_object: 3 lines = file_object.readlines()#讀完文件 4 5 pi_string = ‘‘ # 6 for line in lines: 7 pi_string += line.strip()#把每個line的內容去掉空格加入Pi——string 8 9 print(pi_string #View Code打印 10 print(len(pi_string))#量一下你有多長
註意:讀取文本文件時,python將其中所有文本都解讀穩字符串。
寫入文件
將文本寫入文件時,調用open()時需要提供另外一個實參。其中,第一個實參時要打開的文件的名稱。第二個實參是指定的模式:讀取模式(‘r‘
)、寫入模式(‘w‘
)、附加模式(‘a‘
)、讀取和寫入模式(‘r+‘
)。如果省略將以默認的只讀模式打開文件。
如果寫入的文件不存在,則open()
會自動創建它。如果以寫入模式打開文件且指定文件對象存在,則返回文件對象前會清空改文件。
運行結果:
1 filename = ‘programming.txt‘ 2 with open(filename, ‘w‘) as file_object: 3 file_object.write("I love programming.") 4 file_object.write("I love programming.\n")#註意換行符\n 5 file_object.write("I love creating new games.\n")View Code
註意:python只能將字符串寫入文本文件。函數write()
不會在寫入的文本末尾添加換行符。
附加到文件
運行結果:
1 filename = ‘programming.txt‘ 2 with open(filename, ‘a‘) as file_object:#‘a’ 代表附加模式,在末尾添加內容 3 file_object.write("I also love finding meaning in large datasets.\n") 4 file_object.write("I love creating apps that can run in a browser.\n")View Code
異常
異常時python用來管理程序執行期間發生錯誤的特殊對象。
異常是使用try-except
代碼塊處理的。如果try
代碼塊中的代碼運行無誤,則跳過except
代碼塊;如果try
代碼塊中的代碼運行出現錯誤,則運行except
代碼塊。
ZeroDivisionError
是一個異常對象。
1 try:#試試 2 print(5/0) #打印5除以0 3 except ZeroDivisionError: #要是爆發“除以0錯誤” 4 print("You can‘t divide by zero!")#打印你不能除以0View Code
使用try-except
代碼塊也可以隱藏Traceback,防止惡意攻擊等等。
除了try-except
代碼塊還有try-except-else
代碼塊。其中try
代碼塊只包含可能導致錯誤的代碼,而依賴於其成功執行的代碼都放在else
代碼塊中。
如果希望發生錯誤時繼續運行,可以在except
代碼塊中使用pass
語句。pass
語句還充當了占位符,用來提醒我們在程序的某個地方什麽都沒有做。
常見的異常類型如下:
AttributeError:屬性錯誤,特性引用和賦值失敗時會引發屬性錯誤
NameError:試圖訪問的變量名不存在
SyntaxError:語法錯誤,代碼形式錯誤
Exception:所有異常的基類,因為所有python異常類都是基類Exception的其中一員,異常都是從基類Exception繼承的,並且都在exceptions python 模塊中定義。
IOError:python ioerror,一般常見於打開不存在文件時會引發IOError錯誤,也可以解理為輸出輸入錯誤
KeyError:使用了映射中不存在的關鍵字(鍵)時引發的關鍵字錯誤
IndexError:索引錯誤,使用的索引不存在,常索引超出序列範圍
TypeError:類型錯誤,內建操作或是函數應於在了錯誤類型的對象時會引發類型錯誤
ZeroDivisonError:除數為0,在用除法操作時,第二個參數為0時引發了該錯誤
ValueError:值錯誤,傳給對象的參數類型不正確,像是給int()函數傳入了字符串數據類型的參數。
更多內容可以看看怪伽先森小哥哥的文:
https://blog.csdn.net/u011033906/article/details/79653345
存儲數據
模塊json可以讓我們將簡單的python數據結構轉儲到文件中,並在程序再次運行時加載該文件中的數據。並且還可以使用json在python程序中分享數據。
函數json.dump()
接受兩個實參:要存儲的數據以及可用於存儲數據的文件對象。
1 import json #讓json來幫忙 2 numbers = [2, 3, 5, 7, 11, 13] 3 filename = ‘numbers.json‘ 4 5 with open(filename, ‘w‘) as f_obj: 6 #函數json.dump()接受兩個實參:要存儲的數據以及可用於存儲數據的文件對象。 7 json.dump(numbers, f_obj) 8 9 #讀取整個文件 10 with open(filename) as file_object: 11 contents = file_object.read()# 給內容取個代號 12 print(contents.rstrip()) 13 14 with open(filename) as f_obj:#也可以用json.load來打開,畢竟是json自己寫的東西,他當然有辦法打開 15 numbers = json.load(f_obj) 16 print(numbers)View Code
下面將存取數據和異常結合一下程序運行時,從文件獲取用戶名,若文件不存在,則提示輸入用戶名並存儲:
1 import json 2 # 如果以前存儲了用戶名就加載它 3 # 否則提示用戶輸入用戶名並存儲它 4 filename = ‘username.json‘ 5 ask = ‘‘ 6 while ask != "no": 7 try:#試試打開username 8 with open(filename) as f_obj: 9 username = json.load(f_obj) 10 except FileNotFoundError: #如果發生“找不到文件”錯誤 11 username = input("What is your name? ")#讓用戶自己輸入自己的名字 12 with open(filename, ‘w‘) as f_obj:#打開一個以用戶的名字的文件,要是沒有就創建一個 13 json.dump(username, f_obj)#用json家的dump寫文件 14 print("We‘ll remember you when you come back, " + username + "!") 15 #打印告訴用戶我會記住你的 16 ask = input("Next one?yes/no ") 17 else: 18 print("Welcome back, " + username + "!")#要不就打印歡迎回來,某某某! 19 ask = input("Next one?yes/no ")View Code
萌新向Python數據分析及數據挖掘 第一章 Python基礎 第十節 文件和異常