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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...