Python中對open讀取文件內容時的mode模式解析

来源:https://www.cnblogs.com/xxpythonxx/archive/2023/07/04/17526045.html
-Advertisement-
Play Games

併發指同一時間內進行了多個線程。併發問題是多個線程對同一資源進行操作時產生的問題。通過加鎖可以解決併發問題,ReentrantLock是鎖的一種。 ...


1.Python可以使用open函數來實現文件的打開,關閉,讀寫操作;

Python3中的open函數定義為:

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

其中mode列表為:

'r' #open for reading (default)
'w' #open for writing, truncating the file first
'x' #create a new file and open it for writing,python3新增
'a' #open for writing, appending to the end of the file if it exists
'b' #binary mode
't' #text mode (default),python3新增
'+' #open a disk file for updating (reading and writing)
'U' #universal newline mode (deprecated)

這裡我們主要關心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的讀寫操作

2.'r'

只讀模式,open函數中mode參數的預設模式,文件不存在的話,報FileNotFoundError(python2是IOError);
文件打開後,初始游標位置為0;
每次讀都是從游標位置開始讀;
如果進行了寫操作,會報如下異常:
io.UnsupportedOperation: not writable

3.'w'

只寫模式,文件不存在的話,創建文件;文件存在的話,首先清空文件,然後開始寫;
文件打開後,初始游標位置為0;
每次寫都是從游標位置開始寫;
如果進行了讀操作,首先文件也會被清空,會報如下異常:
io.UnsupportedOperation: not readable

4.'a'

追加模式,文件不存在話,創建文件;文件存在的話,不會清空文件;
文件打開後,初始游標位置為文件結尾;
每次寫都是從結尾開始寫;
如果進行了讀操作,同時報如下異常:
io.UnsupportedOperation: not readable

上面的比較好理解,下麵就有點繞了

5.'r+'

讀寫模式,文件不存在的話,報FileNotFoundError(python2是IOError);
文件打開後,初始游標位置為0;
每次讀寫都是從游標位置開始;但是對於寫操作,類似於替換操作;
看如下代碼:
文件內容為:

abcdefg

代碼內容為:

f = open('open_mode.txt', 'r+')
f.write('xyz')
f.close()

運行代碼後,文件內容變為:

xyzdefg

6.'w+'

只寫模式,文件不存在的話,創建文件;文件存在的話,首先清空文件;
文件打開後,初始游標位置為0;
每次讀寫都是從游標位置開始;寫操作,類似於替換操作;

7.'a+'

追加模式,文件不存在話,創建文件;文件存在的話,不會清空文件;
文件打開後,初始游標位置為文件結尾;
每次寫都是從結尾開始寫;
讀操作從游標位置開始;

8.'x'

python3新加
創建文件並寫操作,操作必須是不存在的文件,如果操作的文件已存在,則報錯FileExistsError
不可讀,如果進行了讀操作,同時報如下異常:

io.UnsupportedOperation: not readable

9.'b'

二進位形式讀寫文件;
寫數據時,寫入的數據類型必須為字元串類型,其他類型必須通過json(就是符合json格式的字元串)寫入
python2與python3對於'b’ mode的行為不同,這和python2與python3的字元串類型有關;事實上,python的字元串類型有兩種;
Python2的兩種字元串類型,分別叫做str和Unicode,str實例包含原始的8位值;而unicode的實例,則包含Unicode字元。
Python2的兩種字元串類型,分別叫做byte和str,與python2不同的是,byte實例包含原始的8位值;而str的實例,則包含Unicode字元。
當讀寫文件採用'b'的模式時,要求必須以二進位形式讀寫,在python2中,字元串必須為str字元串,python3中必須為byte字元串;所以在python3,'b'模式下這樣讀寫字元串

s = b'hello world!' #註意是byte字元串
f = open('open_mode.txt','wb')
f.write(s)

或:

s = 'hello world!'f= open('open_mode.txt','wb')
f.write(s.encode(encoding='utf-8'))

不然會報如下錯誤:

Traceback (most recent call last):
File"C:/Users/Desktop/Python/cnblogs/數據類型.py", line 125, in f.write(s)
TypeError: a bytes-like object is required, not 'str'

read文本的相關方法

準備測試數據 test.txt

富強、民主、文明、和諧,
自由、平等、公正、法治,
愛國、敬業、誠信、友善。

python 讀取文件的常用方法open()
讀取的方法,有read(),readline(),readlines()

1.read()

read()方法是讀取整個文件,將整個文件的內容放在一個字元串變數中.
這個方法的缺點就是當文件過大尤其是大於記憶體時,方法就失效了.

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.read()
    print(res)

直接輸出文件里的所有內容

富強、民主、文明、和諧,
自由、平等、公正、法治,
愛國、敬業、誠信、友善。

2.readline()

readline()方法是每次只讀取一行,並將讀取的內容放在一個字元串變數中,缺點是這種方法比較慢.

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.readline()
    print(res)

執行的效果為

富強、民主、文明、和諧,

要想獲取全部的內容,就需要自己手動迴圈了

#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
with open("test.txt", "r", encoding='UTF-8')as f:
    while True:
        line = f.readline()
        if line:
            print(type(line), line)
        else:
            break

結果為

<class 'str'> 富強、民主、文明、和諧,
<class 'str'> 自由、平等、公正、法治,
<class 'str'> 愛國、敬業、誠信、友善。

3.readlines()

readlines()方法一次性讀取整個文件,並自動將內容分析成一個行的列表:

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.readlines()
    print(res)

結果為

['富強、民主、文明、和諧,\n', '自由、平等、公正、法治,\n', '愛國、敬業、誠信、友善。']

去掉/n及分割

with open("test.txt", "r", encoding='UTF-8')as f:
    res = f.read()
    print(res)
    list = res.replace('\n', ',').split(',')
    print(list)

# 迴圈lines
with open("test.txt", "r", encoding='UTF-8')as f:
    lines = f.readlines()
    for line in lines:
        print(line)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230703164452820-448646113.png) # 1. 物理主機 ## 1.1. 以前數據中心硬體就是建立在單個物理機器的高可靠性上的 ## 1.2. 如今通過 ...
  • 環境:Windows10_x64 Python版本 :3.9.2 Pillow版本:9.1.1 寫的博客文章被轉載且不註明出處的情況時有發生,甚至有部分轉載者將文章配圖添加自己的水印!為了保護作者勞動成果,添加水印是一個可選項。 今天記錄下Windows10環境下使用python3.9簡單實現批量添 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第31面: > 面試官:什麼是鎖?有什麼作用? > > 二師兄:在C++中,鎖(Lock)是一種同步工具,用於保護共用資源,防止多個線程同時訪問,從而避免數據競爭和不一致。 > > 面試官:有哪些鎖? > > 二師兄:從種類上分,可以分為普通鎖、讀寫 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《JavaCV的攝像頭實戰》系列的 ...
  • ### 前言 上一篇我們從0到1用`pb`開發了一個`helloworld`程式,併成功將開發的程式編譯打包並且製作了安裝包。 程式員最討厭的莫過於寫文檔和別人不寫註釋。 不知道大家會不會和我一樣,在找bug時,有段代碼,心中不知默默的罵了它多少遍。 哪個sx寫的這代碼,研究了一段時間發現,原來那s ...
  • 1、轉成圖片的方式和轉成html,都存在一定的問題,比如轉圖片的都是存在要處理多圖片的問題,轉html存在複雜樣式丟失的問題。比較好的一種做法就是即將文檔里的內容都生成成圖片(很可能是多張圖片),然後將生成的圖片全都放到一個html頁面里 ,用html+css來保持樣式並實現多張圖片展示,再將htm... ...
  • # HttpSession對象 **HttpSession**對象是javax.servlet.http.HttpSession的實例,該**介面**井不像HttpServletRequest或 HttpServletResponse還存在一個父介面,該介面只是一個純粹的介面。這因為session本 ...
  • 線上代碼 a = [1,2,3] def abc(a): a.remove(1) abc(a) print(a) 這段代碼先指定了一個a變數是個list,又寫了一個abc函數,功能是把外面傳進來的list裡面的1這個值去掉 按理說在函數內的執行只應該屬於函數內的變化,但是實際列印結果是[2,3],函 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...