Python學習DAY09_文件和異常

文件和異常

????????實際開發中常常會遇到對數據進行持久化操作的場景,而實現數據持久化最直接簡單的方式就是將數據保存到文件中。

? ? ? ? 在 Python 中實現文件的讀寫操作其實非常簡單,通過 Python 內置的 open 函數,我們可以指定文件名、操作模式、編碼信息等來獲得操作文件的對象,接下來就可以對文件進行讀寫操作了。這里所說的操作模式是指要打開什么樣的文件(字符文件還是二進制文件)以及做什么樣的操作(讀、寫還是追加)。

操作模式具體含義
r讀寫
w寫入(會截斷之前的內容)
x寫入,如果文件已經存在會產生異常
a追加,將內容寫入到已有文件的末尾
b二進制模式
t文本模式
+更新(可讀又可寫)

讀寫文本文件?

?????????讀取文本文件時,需要在使用 open 函數時指定好帶路徑的文件名(可以使用相對路徑或絕對路徑)并將文件模式設置為 r?(如果不指定,默認值也是'r'),然后通過 encoding?參數指定編碼(如果不指定,默認值是 None,那么在讀取文件時使用的是操作系統默認的編碼),如果不能保證保存文件時使用的編碼方式與 encoding 參數指定的編碼方式是一致的,那么就可能因無法解碼字符而導致讀取失敗。

def main():file = open('test.txt', 'r', encoding='utf-8')print(file.read())file.close()if __name__ == '__main__':main()

? ? ? ? 如果 open 函數指定的文件并不存在或者無法打開,那么將引發異常狀況導致程序崩潰。為了讓代碼有一定的健壯性和容錯性,我們可以使用 Python 的異常機制對可能在運行時發生狀況的代碼進行適當的處理。

def main():file = Nonetry:file = open('test.txt', 'r', encoding='utf-8')print(file.read())except FileNotFoundError:print('無法打開指定的文件!')except LookupError:print('指定了未知的編碼!')except UnicodeDecodeError:print('讀取文件時解碼錯誤!')finally:if file:file.close()if __name__ == '__main__':main()

????????在 Python?中,我們可以將那些在運行時可能會出現狀況的代碼放在 try?代碼塊中,在 try?代碼塊的后面可以跟上一個或多個 except?來捕獲可能出現的異常狀況。例如在上面讀取文件的過程中,文件找不到會引發 FileNotFoundError?,指定了未知的編碼會引發 LookupError?,而如果讀取文件時無法按指定方式解碼會引發 UnicodeDecodeError?,我們在 try?后面跟上了三個 except?分別處理這三種不同的異常狀況。最后我們使用 finally 代碼塊來關閉打開的文件,釋放掉程序中獲取的外部資源,由于 finally 塊的代碼不論程序正常還是異常都會執行到(甚至是調用了 sys?模塊的 exit?函數退出 Python 環境, finally 塊都會被執行,因為 exit?函數實質上是引發了 SystemExit?異常),因此我們通常把 finally 塊稱為“總是執行代碼塊”,它最適合用來做釋放外部資源的操作。如果不愿意在 finally 代碼塊中關閉文件對象釋放資源,也可以使用上下文語法,通過 with?關鍵字指定文件對象的上下文環境并在離開上下文環境時自動釋放文件資源。

def main():try:with open('test.txt', 'r', encoding='utf-8') as file:print(file.read())except FileNotFoundError:print('無法打開指定的文件!')except LookupError:print('指定了未知的編碼!')except UnicodeDecodeError:print('讀取文件時解碼錯誤!')if __name__ == '__main__':main()

????????除了使用文件對象的 read?方法讀取文件之外,還可以使用 for-in?循環逐行讀取或者用 readlines 方法將文件按行讀取到一個列表容器中。

def main():# 一次性讀取整個文件內容with open('test.txt', 'r', encoding='utf-8') as file:print(file.read())# 通過for-in循環逐行讀取with open('test.txt', mode='r') as file:for line in file:print(line, end='')print()# 讀取文件按行讀取到列表中with open('test.txt') as file:lines = file.readlines()print(lines)if __name__ == '__main__':main()

????????要將文本信息寫入文件文件也非常簡單,在使用 open?函數時指定好文件名并將文件模式設置為 w 即可。注意如果需要對文件內容進行追加式寫入,應該將模式設置為 a?。如果要寫入的文件不存在會自動創建文件而不是引發異常。

? ? ? ? 將1~99分別寫入兩個文件中(1~50寫入test1.txt,51~99寫入test2.txt)。

def main():filenames = ('test1.txt', 'test2.txt')file_list = []try:for filename in filenames:file_list.append(open(filename, 'a', encoding='utf-8'))for number in range(1, 100):if number < 100:file_list[0].write(str(number) + '\n')else:file_list[1].write(str(number) + '\n')except IOError as ex:print(ex)print('寫文件時發生錯誤!')finally:for file in file_list:file.close()print('操作完成!')if __name__ == '__main__':main()

讀寫二進制文件

? ? ? ? 在了解完文本文件的讀寫后,再學習二進制文件的讀寫就很簡單,只需要在模式中加入 b 即可。

? ? ? ? 實現復制圖片的功能。

def main():try:with open('tp1.jpg', 'rb') as file1:data = file1.read()print(type(data))  # <class 'bytes'>with open('tp2.jpg', 'wb') as file2:file2.write(data)except FileNotFoundError as e:print('指定的文件無法打開.')except IOError as e:print('讀寫文件異常.')if __name__ == '__main__':main()

讀寫JSON文件

? ? ? ? ?我們已經了解如何將文本數據和二進制數據保存到文件中,那么又該如何將一個列表或者一個字典中的數據保存到文件中呢?

? ? ? ? 列表和字典中的數據可以通過 JSON 格式保存到文件中。

????????JSON 是 “JavaScript Object Notation” 的縮寫,它本來是 JavaScript 語言中創建對象的一種字面量語法,現在已經被廣泛的應用于跨平臺跨語言的數據交換,原因很簡單,因為JSON也是純文本,任何系統任何編程語言處理純文本都是沒有問題的。目前 JSON 基本上已經取代了 XML 作為異構系統間交換數據的事實標準。?

? ? ? ? 簡單的 JSON 例子。?

{"name": "小明","age": 12,"phone": 1888888,"friends": ["小紅", "小白"],"toys": [{"tname": "悠悠球", "price": 25},{"tname": "陀螺", "price": 10},{"tname": "遙控汽車", "price": 200}]
}

????????上面的 JSON 跟 Python 中的字典其實是一樣一樣的,事實上 JSON 的數據類型和 Python 的數據類型是很容易找到對應關系的。

JSONPython
objectdict
arraylist
stringstr
numberint/float
true/falseTrue/False
nullNone

????????使用 Python 中的 json 模塊就可以將字典或列表以 JSON 格式保存到文件中。

import jsondef main():mydict = {"name": "小明","age": 12,"phone": 1888888,"friends": ["小紅", "小白"],"toys": [{"tname": "悠悠球", "price": 25},{"tname": "陀螺", "price": 10},{"tname": "遙控汽車", "price": 200}]}try:with open('data.json', 'w', encoding='utf-8') as file:json.dump(mydict, file)except IOError as e:print(e)print('保存數據完成!')if __name__ == '__main__':main()

????????json模塊主要有四個比較重要的函數,分別是:

  • dump?- 將Python對象按照JSON格式序列化到文件中
  • dumps?- 將Python對象處理成JSON格式的字符串
  • load?- 將文件中的JSON數據反序列化成對象
  • loads?- 將字符串的內容反序列化成Python對象

?????????序列化(serialization)在計算機科學的數據處理中,是指將數據結構或對象狀態轉換為可以存儲或傳輸的形式,這樣在需要的時候能夠恢復到原先的狀態,而且通過序列化的數據重新獲取字節時,可以利用這些字節來產生原始對象的副本(拷貝)。與這個過程相反的動作,即從一系列字節中提取數據結構的操作,就是反序列化(deserialization)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1552.平衡二叉樹

輸入格式 第一行包含整數 N&#xff0c;表示總插入值數量。第二行包含 N 個不同的整數&#xff0c;表示每個插入值。 輸出格式 輸出得到的 AVL 樹的根是多少。 數據范圍 1≤N≤20 輸入樣例1&#xff1a; 5 88 70 61 96 120 輸出樣例1&#xff1a; 70 輸入樣例2&#xff1a…

商業江湖大揭秘:月入千萬與顆粒無收,究竟差了什么?

在商業的浩瀚江湖 英雄豪杰們或乘風破浪、月入千萬&#xff0c;或步履蹣跚、顆粒無收&#xff0c;這背后的奧秘究竟何在&#xff1f;是天意難測&#xff0c;還是人為疏忽&#xff1f;是制度的不完善&#xff0c;還是工具的滯后不前&#xff1f;答案就隱藏在你未曾注意的細節之…

公司招嵌入式開發崗位,為什么感覺一年比一年難?

最近看到一個問題&#xff1a; 是一個HR在吐槽招不到嵌入式開發的人才。 這句話&#xff0c;難免會誤導一些想入行嵌入式的同學&#xff0c;臥槽&#xff0c;這么缺人?趕緊沖&#xff01; 哼次哼次學完一堆技術棧&#xff0c;一投簡歷&#xff0c;一個面試機會都沒有。 這就是…

24路電磁鎖主板在智能存儲系統中的作用

在無人值守場景中&#xff0c;如自助服務機、智能生鮮柜、共享儲物柜等&#xff0c;使用24路電磁鎖主板可以集成身份識別技術&#xff0c;將用戶的驗證結果轉化為相應的開鎖動作&#xff0c;提升用戶體驗和運營效率&#xff0c;是實現智能存儲系統高效、安全和自動化運行的關鍵…

Kubernetes的五大開源存儲項目

在Kubernetes中&#xff0c;關于數據的持久化管理是一種挑戰&#xff0c;對此&#xff0c;社區提供了多種存儲的解決方案&#xff0c;這些方案旨在簡化和優化容器化應用程序的持久化數據管理。 現介紹 Kubernetes 的五大開源存儲項目&#xff0c;帶你了解開源存儲解決方案的多…

unity后期

unity|后處理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后處理效果 抗鋸齒①、Ambient Occlusion 環境光遮蔽②、Auto Exposure 自動曝光③、Bloom 輝光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色調/顏色分級⑥、Depth Of Fiel…

銳捷網絡攜數據中心、以太全光等創新解決方案亮相2024MWC

在西班牙巴塞羅那舉行的2024年世界移動通信大會(MWC)上,銳捷網絡(下文簡稱“銳捷”)展示了將技術與應用充分融合的云數據中心、5G、光網絡等產品及解決方案,幫助更多行業組織建設更貼近業務、智能、簡單、高效、綠色低碳的網絡基礎設施,應對當下及未來的挑戰,共同連接更廣闊可能…

PHP語言常見面試題:請解釋一下PHP是什么,以及它的主要用途是什么?

PHP&#xff0c;英文全稱為Hypertext Preprocessor&#xff0c;中文名稱為“超文本預處理器”。它是一種通用的開源腳本語言&#xff0c;特別適用于Web開發領域。PHP最初是由Rasmus Lerdorf在1995年創建的&#xff0c;并且自那時以來&#xff0c;它已經發展成為一個功能強大且易…

骨傳導耳機好用嗎?六大選購法則與避坑技巧大公開

在過去的兩年里&#xff0c;骨傳導耳機逐漸成為大眾的新寵&#xff0c;這一趨勢并不出人意料。畢竟長時間使用音量過大的傳統入耳式耳機&#xff0c;多多少少會對我們的聽力健康構成威脅。然而不同耳機對聽力的潛在影響程度是有差異的。骨傳導耳機好用嗎&#xff1f;與傳統耳機…

租床小程序|租床系統|租賃軟件開發功能

隨著移動互聯網的普及&#xff0c;越來越多的人開始選擇在線上完成各種租賃業務&#xff0c;而醫院租床也不例外。在這個趨勢下&#xff0c;開發一款租賃小程序成為了市場的必然需求。 租床小程序的功能 1、搜索與篩選 為了滿足不同用戶的需求&#xff0c;小程序應該提供設備…

android適配器adapter,Android程序員架構之路該如何繼續學習

便于開發的插件、工具和第三方開源庫 1.GsonFormat 使用方法&#xff1a;快捷鍵AltS也可以使用AltInsert選擇GsonFormat&#xff0c;作用&#xff1a;速將json字符串轉換成一個Java Bean&#xff0c;免去我們根據json字符串手寫對應Java Bean的過程。 2.ButterKnife Zelezny …

vmware16 nat模式 經常掉線 需要重啟nat

vmware16 nat模式 經常掉線 需要重啟nat才能聯網&#xff0c;之后又過一會掉線&#xff0c;往復操作重啟nat. 修復方案&#xff08;待驗證&#xff09; 修改靜態ip 嘗試過的方案&#xff08;無效果&#xff09; 一 調整 MaxUserPort 和 TcpTimedWaitDelay 設置 連接&#xf…

關于Node.js異常處理的教程

在Node.js開發中&#xff0c;異常處理是非常重要的一部分。良好的異常處理可以幫助我們及時發現和解決問題&#xff0c;提高系統的穩定性和可靠性。本教程將向您介紹Node.js中異常處理的最佳實踐和策略。 1. 使用try-catch捕獲同步異常 在Node.js中&#xff0c;可以使用try-c…

【Linux C | 網絡編程】getaddrinfo 函數詳解及C語言例子

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

element-plus 的el-img組件訪問oss圖片自動拼接前端地址

這是我的組件代碼 <el-image style"width: 100px; height: 100px" :src"scope.row.logo" />訪問時候 竟然憑借上了前端的地址端口 原來是我的oss服務是使用了域名做cdn加速的 內容分發網絡&#xff08;CDN&#xff09;或者服務器配置&#xff0c;可…

k8s學習-數據管理之nfs手動搭建

需要先準備好3臺虛擬機 系統CentOS7 IP 192.168.200.128 master IP 192.168.200.129 node1 IP 192.168.200.130 node2 問題描述 在學習數據管理的時候創建完pv和pvc以后&#xff0c;創建了pod使用pvc&#xff0c;但是pod創建不成功。 查看pod描述 kubectl describe pod myp…

安全防御(第六次作業)

攻擊可能只是一個點&#xff0c; 防御需要全方面進行 IAE引擎 DFI和DPI技術 --- 深度檢測技術 DPI --- 深度包檢測技術 --- 主要針對完整的數據包&#xff08;數據包分片&#xff0c;分段需要重組&#xff09; &#xff0c;之后對 數據包的內容進行識別。&#xff08;應用層&a…

【湖南省建筑類中級職稱申報攻略】企業專場條件寬松,不費勁拿證書!

【湖南省建筑類中級職稱申報攻略】企業專場條件寬松&#xff0c;不費勁拿證書&#xff01; 2024年湖南省電力電氣工程師申報評審/企業專場不費勁 湖南省建筑類中級職稱申報評審都是以考代評&#xff0c;符合條件參加考試&#xff0c;考試合格了&#xff0c;職稱申報審核通過就…

c語言經典測試題8

在c語言經典測試題6的第一題&#xff0c;大家是否想過可不可以將遞歸參數改為s呢&#xff1f;或許有的人已經試過了&#xff0c;但是發現好像不會有結果&#xff0c;其實是因為s為后置&#xff0c;先試用后加1&#xff0c;然而我們這個是在s出了函數之后才會運行加1操作&#x…

CentOS 7開啟Web服務

之前有寫過用kali開啟web服務方法&#xff0c;這次寫個用cendos7開啟服務的步驟&#xff01; 1、安裝httpd yum install -y httpd 若顯示安裝失敗&#xff0c;報錯原因為找不到httpd的安裝包&#xff0c;可參考這篇文件更新yum源&#xff1a;CentOS 7更換yum源|詳細步驟-CSDN…