python文件IO基礎知識

目錄

1.open函數打開文件

2.文件對象讀寫數據和關閉

3.文本文件和二進制文件的區別

4.編碼和解碼

讀寫文本文件時

讀寫二進制文件時

5.文件指針位置

6.文件緩存區與flush()方法


1.open函數打開文件

使用 open 函數創建一個文件對象,read 方法來讀取數據,write 方法來寫數據
語法:fileObject = open(filename, mode)
filename文件路徑
mode取值:
  • "r":為了讀打開一個文件
  • "w":為了寫打開一個文件,如果文件已經存在則覆蓋
  • "a":為了寫打開一個文件,從文件末尾追加寫入
  • "rb":為讀取二進制數據打開文件
  • "wb":為寫入二進制數據打開文件
  • "ab":追加寫入二進制數據
file1 = open("scores.txt", "r")# 在 filename 前加上 r 表示將反斜線\看做普通的字符,使其沒有其他功能
file2 = open(r"c:\pybook\scores.txt", "r")  # 如果沒有 r 前綴,使用轉義序列
file3 = open("c:\\pybook\\scores.txt", "r")  

2.文件對象讀寫數據和關閉

open函數創建了一個文件對象,這是_io.TextIOWrapper類的一個實例。這個類包含了讀寫數據和文件關閉的方法。

特別說明:

  • readline()是讀取當前行中還未讀取的內容,返回字符串。這個行指以換行符\n 結尾之前的內容
  • readlines()是讀取剩下所有未讀取的內容,返回列表,列表的每一個元素時每行未讀取的字符串
  • print 函數會自動插入換行符\n,而 write 方法需要顯式地添加一個換行符號\n 用來換行寫數據
  • close方法必須被調用,特別是寫文件時,忘記close可能導致文件內容無法寫入
def main():outfile = open("Presidents.txt", "w")outfile.write("QingHui\t")outfile.write("ZhangSan\n")outfile.write("XiaoWang\t")outfile.write("DaBing\n")outfile.write("Others")outfile.close()file2 = open("Presidents.txt", "r")string1 = file2.read(10)print(string1)  # QingHui	Zhstring3 = file2.readline()print(string3)  # angSanstring4 = file2.readlines()  # ['XiaoWang\tDaBing\n', 'Others']print(string4)file2.close()main()

按行讀取文件全部數據

# 法一
infile = open("Presidents.txt", "r")
all_data = []
line = infile.readline()
while line != '':all_data.append(line)line = infile.readline()
print(all_data)# 法二
infile = open("Presidents.txt", "r")
all_data = []
for line in infile:all_data.append(line)
print(all_data)"""
['QingHui\tZhangSan\n', 'XiaoWang\tDaBing\n', 'Others\n', '\n', '\n']
['QingHui\tZhangSan\n', 'XiaoWang\tDaBing\n', 'Others\n', '\n', '\n']
"""

簡潔讀寫文件

with open(參數) as file, 自動關閉文件
filepath = r"D:\test\1.txt"with open(filepath, "r") as file:for line in file:print(line, end="")print()with open(filepath, "rb") as file:for line in file:line = line.decode("gbk", "ignore")print(line, end="")print()
讀寫數值數據
由于文本文件中的數據都是字符串類型,所以在進行數值數據的讀寫的時候都要進行相應的數據類型轉換。為了正確地讀出文件中的數字,利用” ”或者\n 的空白符來分隔數字。復雜一點的需要使用正則表達式。
from random import randintdef main():outfile = open("Numbers.txt", "w")for i in range(100):outfile.write(str(randint(0, 9)) + " ")outfile.close()infile = open("Numbers.txt", "r")s = infile.read()numbers = [eval(x) for x in s.split()]for number in numbers:print(number, end = " ")infile.close()main()

3.文本文件和二進制文件的區別

【c基礎】文件操作-CSDN博客

參考這篇文章中《2.文本文件與二進制文件的區別》

4.編碼和解碼

讀寫文本文件時

  • 編碼就是將文本模式變成二進制模式。在向一個文本文件寫入指定內容時,會將文本內容按指定編碼類型編碼為二進制,然后放在文件中。
  • 解碼就是二進制模式變為文本模式。在從一個文本文件讀取內容時,會將讀取到的二進制內容按指定編碼類型解碼為字符串
打開文件時,如果不指定編碼方式,則默認utf-8,不過也可以使用encoding參數指定編碼方式。
注意寫入文件時用什么編碼方式,讀取時也最好用什么編碼方式,這樣保證內容能正確讀取到,否則會出現UnicodeDecodeError或者亂碼。
w_file = open("data.txt", "w", encoding="gbk")
w_file.write("你好中國")
w_file.close()# 當用不同的編碼方式讀取文件內容時會報錯或者出現亂碼
r_file = open("data.txt", "r", encoding="utf-8")
for line in r_file:print(line)
r_file.close()"""
會報錯:UnicodeDecodeError: 
'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
"""

如何手動查看文本文件的編碼方式

如何手動修改文本文件的編碼方式:文件另存為時設置

讀寫二進制文件時

讀寫二進制文件時,在用open函數創建文件對象,不能使用encoding函數,否則會"ValueError: binary mode doesn't take an encoding argument"。而是在write函數前對需要寫入的字符串內容進行encode,或者在read讀到的內容后進行decode。
# 寫入數據
file = open("data.txt", "wb")
data = "hello 中國"   # 字符串內容
file.write(data.encode("utf-8"))  # 將字符串內容按utf-8編碼為二進制寫入到文件中
# 這個時候去查看"data.txt"的編碼就可以看到是 utf-8 編碼了
file.close()# 讀取數據
file = open("data.txt", "rb")
txt = file.read().decode("utf-8")
print(type(txt))  # <class 'str'>
print(txt)   # hello 中國
file.close()

5.文件指針位置

在創建文件時,文件指針位置在起始位置,在第 0 行的前面。每次讀或寫時,文件指針位置都會前移。

可以使用seek主動調整文件指針位置。

  • seek(arg1, arg2) 第一個參數是偏移量,第二個參數表示模式,0 表示開頭,1 為中間,2 為末尾
  • file.seek(16, 0) 表示指針從開頭的第 16 個字符起開始
  • file.seek(0, 0) 文件指針跳轉到開頭

tell 方法獲取文件指針當前的位置

file = open("data.txt", "w")
file.write("1234567\n")
file.write("89\n")
file.write("xyz\n")
file.close()file = open("data.txt", "r")
print(f"index={file.tell()}\n")  # 1for i in range(12):ret = file.read(1)print(f"value=({ret})")  # 1print(f"index={file.tell()}\n")  # 1file.close()

運行結果

index=0value=(1)
index=1value=(2)
index=2value=(3)
index=3value=(4)
index=4value=(5)
index=5value=(6)
index=6value=(7)
index=18446744073709551624value=(
)
index=9value=(8)
index=10value=(9)
index=18446744073709551628value=(
)
index=13value=(x)
index=14

注意在換行符號"\n"處,文件指針跳動了兩個單位,是因為windows下"\n"會自動變成"\r\n"。

6.文件緩存區與flush()方法

write 是寫入內存的緩沖區,沒有實時寫入
等到 file.close()后再集中處理,或者緩沖區滿了就真正寫入
緩沖區的作用:磁盤是有壽命的,讀取 or 寫入一次壽命就會減少
import timefile = open("data.txt", "w")
file.write("abcdefg")file.flush()  # 刷新,實時寫入
# 此時查看data.txt中會有數據"abcdefg",否則會等到file.close() 才有數據
# 有了這個語句就不怕忘記寫 file.close()這個了time.sleep(30)
file.close()  # 文件是在文件關閉后才能寫入,很重要

end

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

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

相關文章

談談磁盤的那些操作

磁盤格式化 是指把一張空白的盤劃分成一個個小區域并編號&#xff0c;以供計算機存儲和讀取數據。格式化是一種純物理操作&#xff0c;是在磁盤的所有數據區上寫零的操作過程&#xff0c;同時對硬盤介質做一致性檢測&#xff0c;并且標記出不可讀和壞的扇區。由于大部分硬盤在…

電子技術學習路線

在小破站上看到大佬李皆寧的技術路線分析&#xff0c;再結合自己這幾年的工作。發現的確是這樣&#xff0c;跟著大佬的技術路線去學習是會輕松很多&#xff0c;現在想想&#xff0c;這路線其實跟大學四年的學習順序是很像的。 本期記錄學習路線&#xff0c;方便日后查看。 傳統…

python 深度圖生成點云(方法二)

深度圖生成點云 一、介紹1.1 概念1.2 思路1.3 函數講解二、代碼示例三、結果示例接上篇:深度圖生成點云(方法1) 一、介紹 1.1 概念 深度圖生成點云:根據深度圖像(depth image)和相機內參(camera intrinsics)生成點云(PointCloud)。 1.2 思路 點云坐標的計算公式如…

pillow學習7

繪制驗證碼 from PIL import Image,ImageFilter,ImageFont,ImageDraw import random width100 hight100 imImage.new(RGB,(width,hight),(255,255,255)) drawImageDraw.Draw(im) #獲取顏色 def get_color1():return (random.randint(200, 255), random.randint(200, 255), ran…

京東Java社招面試題真題,最新面試題

Java中接口與抽象類的區別是什么&#xff1f; 1、定義方式&#xff1a; 接口是完全抽象的&#xff0c;只能定義抽象方法和常量&#xff0c;不能有實現&#xff1b;而抽象類可以有抽象方法和具體實現的方法&#xff0c;也可以定義成員變量。 2、實現與繼承&#xff1a; 一個類…

幾種常用的配置文件格式對比分析——ini、json、xml、toml、yaml

配置文件用于存儲軟件程序的配置信息&#xff0c;以便程序能夠根據這些信息進行自定義和調整。常用的配置文件格式包括INI、XML、JSON和YAML。下面對它們進行簡單介紹&#xff0c;并分析各自的優缺點。 1. INI 文件格式 簡介&#xff1a; INI&#xff08;Initialization&…

FPGA之tcp/udp

在調試以太網的過程中&#xff0c;考慮了vivado IP配置(管腳、reset等)&#xff0c;SDK中PHY芯片的配置(芯片地址、自適應速率配置等)&#xff0c;但是&#xff0c;唯獨忽略了tcp/udp協議&#xff0c;所以在ping通之后仍無法連接。 所以現在來學習一下tcp與udp的區別 ---- 為什…

經典面試題:進程、線程、協程開銷問題,為什么進程切換的開銷比線程的大?

上下文切換的過程&#xff1f; 上下文切換是操作系統在將CPU從一個進程切換到另一個進程時所執行的過程。它涉及保存當前執行進程的狀態并加載下一個將要執行的進程的狀態。下面是上下文切換的詳細過程&#xff1a; 保存當前進程的上下文&#xff1a; 當操作系統決定切換到另…

浪潮信息IPF24:AI+時代,創新驅動未來,攜手共創智慧新紀元

如今&#xff0c;數字化時代的浪潮席卷全球&#xff0c;人工智能已經成為推動社會進步的重要引擎。浪潮信息IPF24作為行業領先的AI技術盛會&#xff0c;不僅為業界提供了交流合作的平臺&#xff0c;更在激發創新活力、拓展發展路徑、加速AI技術落地等方面發揮了重要作用。 升級…

OS復習筆記ch6-2

死鎖的解決 死鎖的預防&#xff08;打疫苗&#xff09;死鎖的避免&#xff08;戴口罩&#xff09;死鎖的檢測&#xff08;做核酸&#xff09; 死鎖的預防 前面我們提到了死鎖的四個必要條件 防止前三個必要條件&#xff0c;就是間接預防防止最后一個必要條件–循環等待&…

軟測刷題-錯題1

提高測試效率的方法&#xff1a; 1、不要做無效的測試 2.不要做重復的測試 3.不同測試版本的測試側重點 4.優化測試順序 LoadRunner是對服務器進行施壓。 在數據庫中存在的用戶數是指注冊用戶數。 input標簽可以直接使用send_keys實現上傳&#xff0c;而非input標簽是無法直…

Rust后臺管理系統Salvo-admin源碼編譯

1.克隆salvo-admin后臺管理系統源碼: https://github.com/lyqgit/salvo-admin.git 2.編譯 編譯成功 3.創建mysql數據庫與執行sql腳本 輸入名稱ry-vue 執行sql腳本 全部執行上面3個sql 修改數據庫用戶名與密碼: 清理及重新編譯 cargo clean cargo build 4.運行并測試 cargo…

Android內存碎片化調優

概念 內存碎片分為兩種,一種是內存頁中的碎片,被稱為內部碎片;另一種是空閑分散的內存頁,湊不齊一個組物理地址連續的空閑內存頁,就沒辦法分配了,這些散落的內存頁被稱為外部碎片。 在Android系統中,內存碎片化是指內存中存在很多小塊的空閑內存,這些內存塊之間不連續…

使用vue,mybatis,mysql,tomcat,axios實現簡單的登錄注冊功能

目錄 第一步環境搭建 后端&#xff1a; 前端&#xff1a; 第二步畫流程圖 web: service: dao層&#xff1a; 第三步前端代碼的實現 這是開始的頁面&#xff0c;接下來我們要到router路由下書寫#login的路徑 路由中的component在我們自己創建的views書寫vue文件…

單日收益1000+看了就會的項目,最新靈異短視頻項目,簡單好上手可放大操作

各位好友&#xff0c;佳哥在此與大伙兒聊聊一項神秘莫測的短視頻項目。你或許會想&#xff0c;“又是一個視頻創作項目&#xff1f;” 但別急&#xff0c;這個項目與眾不同&#xff0c;日入千元不再是夢&#xff0c;而且它的易用性讓人驚喜&#xff0c;無論你是初學者還是資深玩…

春秋云境CVE-2018-7422

簡介 WordPress Plugin Site Editor LFI 正文 1.進入靶場 2.漏洞利用 /wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path/../../../../../../flag看別人wp做的。不懂怎么弄的&#xff0c;有沒有大佬講一下的

沒有電商經驗的人去操作抖音小店,難度大不大?好操作嗎?

大家好&#xff0c;我是電商小V 很多新手小伙伴想去操作抖音小店項目&#xff0c;咨詢的最多的問題就是我沒有電商運營的經驗可以去操作嗎&#xff1f; 當然是可以操作的&#xff0c;抖音小店項目對于新手來說是一個非常友好的項目&#xff0c;很多小伙伴都是感覺沒有電商經驗去…

數據庫攻防之MySQL

MySQL 是最流行的關系型數據庫&#xff0c;與此同時也是 web 應用中最好的關系型數據庫管理應用軟件。我們在滲透過程中碰到的 PHP 站點大部分都會搭配 MySQL 數據庫&#xff0c;因此它是紅隊攻防中最常遇到的數據庫。 0x01 MySQL簡介 MySQL 是典型的關系型數據庫&#xff0c;…

YOLOv10 | 無NMS的YOLO | 實時端到端目標檢測的新突破

過去幾年里&#xff0c;YOLOs因在計算成本和檢測性能之間實現有效平衡而成為實時目標檢測領域的主流范式。研究人員針對YOLOs的結構設計、優化目標、數據增強策略等進行了深入探索&#xff0c;并取得了顯著進展。然而&#xff0c;對非極大值抑制&#xff08;NMS&#xff09;的后…

redis--消息隊列

分類 生產者消費模式 發布者訂閱模式 生產者消費模式 在生產者消費者(Producer/Consumer)模式下&#xff0c;上層應用接收到的外部請求后開始處理其當前步驟的操作&#xff0c;在執行完成后將已經完成的操作發送至指定的頻道(channel)當中&#xff0c;并由其下層的應用監聽…