Python基礎_文件讀寫

来源:https://www.cnblogs.com/suguangti/archive/2020/04/19/12732966.html
-Advertisement-
Play Games

一、I/O操作概述 I/O概述: I/O在電腦中時指Input/Output,也就是Stream的輸入與輸出。我們通常說的輸入與輸出其實在操作系統中都是相對於記憶體而言的,InputStream(輸入流)是指數據從外部(網路、鍵盤、I/O設備)流進記憶體,OutputStream正好與之相反,數據從內 ...


一、I/O操作概述

I/O概述:

    I/O在電腦中時指Input/Output,也就是Stream的輸入與輸出。我們通常說的輸入與輸出其實在操作系統中都是相對於記憶體而言的,InputStream(輸入流)是指數據從外部(網路、鍵盤、I/O設備)流進記憶體,OutputStream正好與之相反,數據從記憶體流出到外部。程式運行時,數據都是在哎記憶體中駐留,由CPU這個超級快的計算核心來執行,涉及到數據交換的地方就需要IO介面。

IO介面的提供以及高級編程語言中的IO操作的實現:

    操作系統十個通用的軟體程式,其通用目的如下:     硬體驅動、進程管理、記憶體管理、網路管理、安全管理、I/O管理     操作系統屏蔽了底層硬體,向上提供通用介面。因此,操作I/O的能力是由操作系統提供的,每一種編程語言都會把操作系統提供的低級C介面封裝起來供開發者使用,Python也不例外。

二、文件讀寫實現原理和操作步驟

1.文件讀寫實現原理:

    由於操作I/O的能力是由操作系統提供的,且操作系統不允許普通程式直接操作磁碟,所以讀寫文件時需要操作系統打開一個對象,這個對象通常被稱之為文件描述符--file descriptor,簡稱fd,這個就是我們在程式中要操作的文件對象。     通常高級編程語言會提供一個內置的函數,通過接收‘文件路徑’、‘文件打開模式’等參數來打開一個文件對象,並返回該文件對象的文件描述符。因此通過這個函數我們就可以獲取到要操作的文件對象,在Python中這個函數叫open(),在PHP中叫fopen()

2.文件讀寫操作步驟:

不同編程語言讀寫文件的操作步驟大體都一樣,都分為以下幾步:     1)打開文件,獲取文件描述符;     2)操作文件描述符--讀/寫;     3)關閉文件。

3.需要註意的是:

文件讀寫操作完成後,應該及時關閉。一方面,文件對象會占用操作系統的資源,另一方面,操作系統對同一時間能夠打開的文件描述符的數量是有限的,在linux操作系統上可以通過ulimit -n來查看這個現實數量。如果不能及時關閉文件,還可能造成數據丟失,因為將數據寫入文件時,操作系統不會立即把數據寫入磁碟,而是先把數據放到記憶體緩存區非同步寫入磁碟。當調用close方法時,操作系統才會保證把沒有寫入磁碟的數據全部寫入到磁碟,否則可能會丟失數據。

三、Python3中文件打開模式

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

打開文件的參數通常有:文件路徑名稱、mode參數(即打開模式)、編碼模式... 這裡需要搞清楚的就是mode參數,也就是我們使用什麼模式打開一個文件: Python3源碼中時這樣解釋的: Python3源碼文件其實對文件的打開模式進行了詳細的英文闡述,這裡非常建議大家自己打開builtins.py文件自行查看,我相信研究看懂的遠遠比看別人寫的文章描述的更加深刻。 這裡只是粘貼一部分打開模式的簡單描述部分: ========= =============================================================== Character Meaning --------- --------------------------------------------------------------- 'r'       open for reading (default) 'w'       open for writing, truncating the file first 'x'       create a new file and open it for writing 'a'       open for writing, appending to the end of the file if it exists 'b'       binary mode 't'       text mode (default) '+'       open a disk file for updating (reading and writing) 'U'       universal newline mode (deprecated) ========= =============================================================== 接下來我們隊幾個常見且重要的模式進行中文解析:
打開模式 描述
r 以只讀模式打開文件,並將文件指針指向文件開頭;如果文件不存在則報錯。
w 以只寫模式打開文件,並將文件指針指向文件開頭;如果文件存在則將其情況並寫入,如果文件不存在則創建
a 以只追加寫模式打開文件,並將文件指針指向文件末尾;如果文件不存在則創建。
r+ 在r的基礎上增加可寫功能
w+ 在w的基礎上增加可讀功能
a+ 在a的模式上增加可讀功能
b 讀寫二進位文件(預設是t,表示文本模式),需要與上面幾種模式搭配使用,如:ab,wb,ab
x 創建一個新文件再打開它寫入;如果文件已存在則報錯。
思考1:r+、w+和a+都可以對文件進行讀寫,他們有何區別?     會覆蓋當前文件指針所在位置的字元,如原來文件內容是“Hello World”,以r+模式打開文件寫入“hi”則文件內容變成“hillo World”
打開模式 詳細描述
r+ 會覆蓋當前文件指針所在位置的字元,如原來文件內容是“Hello World”,以r+模式打開文件寫入“hi”則文件內容變成“hillo World”
w+ w+在打開文件時就會先將文件內清空,再進行寫入。
a+ 該模式只能寫在文件末尾,也就是在文件末尾進行追加寫入。
思考2:為何要定義這些模式?為什麼不能像word文檔意義打開它之後既可讀又可寫還可以修改呢?     問題答案參考網上:     跟安全有關,有這種觀點的大部分是做運維的朋友,他們認為這就像linux上的rwx(讀、寫、執行)許可權。     跟操作系統內核管理I/O的機制有關,有這種觀點的大部分是做C開發的,特別是與內核相關的開發人員。為了提高讀寫速度,要寫入磁碟的數據會先放進記憶體緩衝區,之後再回寫。由於可能會同時打開很多文件,當要回寫數據時,需要遍歷以打開的文件判斷是否需要回寫。他們認為如果打開文件時指定了讀寫模式,那麼需要回寫時,只要去查找以“可寫模式”打開的文件就可以了。

四、Python文件操作實例

讀取文件open_test.py,該文件的字元編碼為utf-8 Python3實現: 輸出結果: 這裡需要註意一點就是,我們在讀寫文件時候,特別是在讀的時候大部分情況,如果文件路徑不正確或者文件不存在,也就是找不到文件,又或者是在進行文件操作時候出現I/O錯誤,就會報錯。此時如果要保證代碼的健壯性最好加上try...finally來實現錯誤捕捉以及及時關閉文件對象(優化代碼如下): 輸出結果: 上面關閉文件的代碼有時候很容易忘記,所以我們接下來使用Python with方法來完成自動關閉文件: 輸出結果: 可以看到在with語句中文件時沒有關閉的,只有出了with語句後文件會自動關閉 關於Python with上下文管理的用法可以查看文章瞭解: https://www.cnblogs.com/suguangti/p/11123515.html

五、Python文件讀取相關方法

對文件的讀取操作需要將文件中的數據載入到記憶體中,而在上面所用到的read()方法會一次性的把文件中所有的內容全部載入到記憶體中。這顯然是不合理的,如果我們讀取的是一個大文件,有幾個G的文件時,必然會耗光機器的記憶體或者直接報錯,所以肯定有一些其他的讀取方法來解決:  
方法 描述
read() 一次性讀取文件所有內容
read(size) 每次最多讀取指定長度內容,在Python2中size指定是位元組長度,而在Python3中size指定為字元長度
readlines() 一次性讀取文件所有內容,按行返回一個list
readline() 每次只讀取一行內容
此外還有兩個關於文件指針位置的方法:
方法 描述
seek() 將文件指針移動到指定位元組位置
tell()  

實例一:

輸出結果:

實例二:

輸出結果: readlines()方法跟read()方法一樣,都會消耗大量記憶體空間。

實例三:

或者: 輸出結果:

解決列印每一行換行符問題:

方法一: 方法二: 輸出結果:

六、文件操作其他方法

方法 描述
flush() 刷新緩衝區數據,將緩衝區中的數據立刻寫入文件
next() 返迴文件下一行,這個方法也是file對象實例可以被當作迭代器使用的原因
truncate(size) 截取文件中指定位元組數的內容,並覆蓋保存到文件中,如果不指定size參數,則文件將被清空;Python2中無返回值,Python3返回新文件的內容位元組數
write(str) 將字元寫入文件,沒有返回值
writelines(sequence) 向文件寫入一個字元串貨一個字元串列表,如果字元串列表中元素需要換行要自己加入換行符
fileno() 返回一個整型的文件描述符,可以用於一些底層I/O操作上(如os模塊的read方法)
issatty() 判斷文件是否被連接到一個虛擬終端,是則返回True,否則返回False
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇里已經成功的將一個golang的demo服務部署到k8s環境里了,部署的時候我們用到了yaml配置文件,今天這裡簡單的介紹下如何使用創建kubernetes里的資源。在kubernetes里,一切對象皆為資源,可以通過命令或配置文件來創建。 命令行創建資源 通過命令行可以創建namespace ...
  • gitlab-runner在Kubernetes里安裝的方法可以通過官方提供的chart來用helm3安裝。官方chart的倉庫地址為:https://gitlab.com/gitlab-org/charts/gitlab-runner,但這裡有個問題就是無法配置宿主機的掛載目錄,根據gitlab- ...
  • 作者: "DeppWang" 、 "原文地址" 我通過實現一個簡易的 Spring IoC 容器,算是入門了 Spring 框架。本文是對實現過程的一個總結提煉, 需要配合源碼閱讀 , "源碼地址" 。 結合本文和源碼,你應該可以學到:Spring 的原理和 Spring Boot 的原理。 Spr ...
  • 本篇主要講解如何將golang的服務部署到kubernetes集群里,附帶相關的golang的demo和yml文件內容。純新手入門方式,生產服務需要完整的CI/CD流程來支持。 golang服務代碼 這裡簡單寫一個k8s-demo的服務,提供兩個介面ping和version介面,main.go文件代 ...
  • 案例故事:有一天測試經理髮給我一個Bug列表, 這些Bug都是被開發打回來的無效(WithDrawn)Bug, 就是開發不認為是bug, 測試經理覺得很有必要去分析下, 為什麼這麼多無效bug,到底是什麼原因? 測試經理想知道,是測試提Bug太隨意,還是無此需求,還是開發bug流轉流程不對,還是其他 ...
  • 前言: Python可謂是現在很多人正在學或者想學的一個腳本語言了,提到學習自然就少不了拿項目練手,可是一般的項目根本提不起興趣嘛,這10個項目可是非常有趣的,不信你看看。 【Python 圖片轉字元畫】 用 50 行 Python 代碼完成圖片轉字元畫小工具。通過實驗將學習到 Linux 命令行操 ...
  • 給定四種水果,分別是蘋果(apple)、梨(pear)、桔子(orange)、葡萄(grape),單價分別對應為3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。首先在屏幕上顯示以下菜單:[1] apple[2] pear[3] orange[4] grape[0] exit... ...
  • 一、全局修改 打開即可修改 二、針對當前項目修改 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...