15.python文件(file)方法詳解

来源:https://www.cnblogs.com/bonheur/archive/2020/02/24/12359217.html
-Advertisement-
Play Games

文件的基本操作 文件讀寫: 文件的讀寫滿足以下3個步驟: 1).打開文件 2).操作數據(讀、寫) 3).關閉文件 --> 不要忘記 1).打開文件: python的open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSErr ...


文件的基本操作

文件讀寫:

文件的讀寫滿足以下3個步驟:

1).打開文件

2).操作數據(讀、寫)

3).關閉文件 --> 不要忘記

1).打開文件:

python的open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。

【註意】:使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。

 1 # open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode)
 2 open(file, mode='r')
 3 
 4 # 完整的語法格式為:
 5 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

參數說明:

  • file:             必需,文件路徑(相對或者絕對路徑)
  • mode:         可選,文件打開模式
  • buffering:    設置緩衝
  • encoding:    一般使用utf-8,確定字元集(編碼、解碼);如果不定義,預設使用gbk進行編碼和解碼使用
  • errors:         編碼解碼不一致報錯時會報錯,如果定義errors = 'ignore',不會報錯但是會亂碼,(相對友好)
  • newline:      區分換行符
  • closefd:      傳入的file參數類型
  • opener:

不同模式打開文件的完全列表(即mode參數有類型):

t 文本模式 (預設)。
x 寫模式,新建一個文件,如果該文件已存在則會報錯。
b 二進位模式。
+ 打開一個文件進行更新(可讀可寫)。
U 通用換行模式(不推薦)。
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是預設模式。
rb 以二進位格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是預設模式。一般用於非文本文件如圖片等。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進位格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。
w 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb 以二進位格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。
w+ 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb+ 以二進位格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
ab 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進位格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。


File對象的屬性:

一個文件被打開後,會返回一個file對象,你可以得到有關該文件的各種信息。

1.file.closed返回true如果文件已被關閉,否則返回false。

2.file.mode:返回被打開文件的訪問模式。

3.file.name:返迴文件的名稱。

4.file.softspace:如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。

1 # 打開一個文件
2 fo = open("foo.txt", "w")
3 
4 print(fo.name)        # 文件名:  foo.txt
5 print(fo.closed) # 是否已關閉:False
6 print(fo.mode) # 訪問模式: w 7 print(fo.softspace) # 末尾是否強制加空格: 0

2).讀寫文件:

file對象提供了一系列方法,能讓我們的文件訪問更輕鬆。

1.read([size])從文件讀取指定的字元數,如果未給定或為負則讀取所有。

2.readline([size])從文件中的一行讀取指定的字元數,如果未給定則讀取整行,包括 "\n" 字元。(以字元串的形式返回)

3.readlines()讀取所有行並返回列表,若給定sizeint>0,則是設置一次讀多少字元,這是為了減輕讀取壓力。(返回列表)

4.tell()返迴文件當前位置(返迴文件描述符所定位到的已讀位元組數),註意是位元組

5.seek(num)設置文件當前位置(將文件描述符回到num個位元組位置),註意是位元組

6.write(str)將字元串寫入到文件中,python字元串可以是二進位數據,而不是僅僅是文字。

7.writelines(seq):向文件中寫入一序列的字元串,把seq的內容全部寫到文件中(多行一次性寫入)。

演示讀操作

 1 # 假設a.txt文件中的內容是 abcdefg1234567
 2 
 3 path = r'D:\python\project\文件讀寫\a.txt'
 4 
 5 # 1.打開文件
 6 fr = open(path,'r')   
 7 
 8 # 2.讀取文件中的數據
 9 print(fr.read(3))    # 得到 abc 讀的是字元
10 print(fr.read(4))    # 得到 defg 讀的是字元
11 print(fr.read())      # 得到 1234567(讀取剩餘的所有)
12 
13 # tell():返回已讀的位元組數
14 print(fr.tell())        #接上面的代碼的到 14
15 
16 # seek(num):將文件描述符移動到num位元組位,返回新的文件位置,從num位元組位開始
17 fr.seek(4)         # 表示起始位置從第四位後面的開始
18 print(fr.read())   #得到efg1234567
19 
20 # 3.關閉文件
21 fr.close()

 

演示read()tell()seek()此三個函數參數&返回值的理解

 1 #假設b.txt文件中的內容是 哈哈呵呵嘿嘿
 2 
 3 path = r'b.txt'
 4 
 5 fr = open(path,'r',encoding='gbk')    # 以gbk的方式進行解碼
 6 
 7 #read(num): num記錄的是字元數
 8 print(fr.read(2))         # 得到 哈哈
 9  
10 #tell():返回已讀的位元組數    註意:不是字元
11 print(fr.tell())          # 得到 4
12 
13 print(fr.read())          # 將內容全部讀完  呵呵嘿嘿
14 
15 print(fr.tell())          # 得到 12
16 
17 # seek(num):num記錄了位元組數
18 fr.seek(4)                # 標識符停在第二個‘哈’上   
19 print(fr.read())          # 得到  呵呵嘿嘿
20 
21 # 以下代碼會報錯,相當於停在第三個位元組上,把第二個哈字一分為二,不可以(一個漢字是占兩個位元組)
22 # fr.seek(3)
23 # print(fr.read())
24 
25 fr.close()

 

演示寫操作:

 1 # 打開一個文件
 2 fo = open("foo.txt", "w")
 3 # 寫入內容
 4 fo.write( "www.runoob.com!\nVery good site!\n")
 5  
 6 # 關閉打開的文件
 7 fo.close()
 8 
 9 # *******文件內容*********
10 www.runoob.com!
11 Very good site!
12 

【註意】:write()的特點

1).如果需要寫入的文件並不存在,先創建文件,再寫入數據

2).'w' 操作不能追加數據到文件中,只能覆蓋之前的內容

3).'a' 表示追加字元(保留原本的,不會覆蓋掉)

4).write()沒有自動換行的功能,所以用\n

 

【補充】:讀取文件的三個方法:read()、readline()、readlines()的對比

 1 # read()方法讀取整個文件,將文件內容放到一個字元串變數中。如果文件非常大,尤其是大於記憶體時,無法使用read()方法。
 2 # readline()方法每次讀取一行;返回的是一個字元串對象,保持當前行的記憶體,但是比readlines慢得多。
 3 # readlines()方法一次性讀取整個文件;自動將文件內容分析成一個行的列表,文件大時占記憶體。
 4 
 5 # 兩種文件的遍歷方法比較,for迴圈
 6 # 法一:
 7 for line in open('myfile.txt','r').readlines():
 8         print(line,end='')
 9 
10 # 法二
11 for line in open('myfile.txt','r'):
12         print(line,end='')
13 
14 
15 # 兩種方法的運行結果是一樣的,但是實際有很大的區別:
16 # 法一通過readlines一次性把文件載入到行字元串列表中,然後再對字元串列表進行迭代;
17 # 法二運行的原理有所不同,它並非一次性將所有的內容載入到記憶體中,而是在迭代的時候,迴圈到哪一行才將哪一行讀入到記憶體的,
18 # 這裡涉及到迭代器。因此在這裡法二是文本文件讀取的最佳選擇,簡單,且對任意大小的文件都有效,不會產生記憶體壓力過大的問題。

3).關閉文件

file對象的close()方法刷新緩衝區里任何還沒寫入的信息,並關閉該文件,這之後便不能再進行寫入。

當一個文件對象的引用被重新指定給另一個文件時,Python 會關閉之前的文件。用 close()方法關閉文件是一個很好的習慣。

1 # 關閉打開的文件
2 fo.close()

 

強大的文件操作之shutil模塊

pyhton的shutil模塊是一個高級的文件,文件夾,壓縮包的處理模塊,它提供了一些針對文件和目錄的高級操作,主要是拷貝、移動。對於單個文件的操作,還可參考os模塊。

Warning: 即使是高級別的拷貝函數(shutil.copy(),shutil.copy2())也不能拷貝所有的文件元數據。意思是:在POSIX系統中,文件所有者、屬組以及ACL信息會丟失。在Windows平臺上,文件所有者,ACL以及ADS(供選數據流)不會被覆制。

 

shutil模塊常見的方法:

1.shutil.copy("oldfile","newfile"):拷貝文件的內容和許可權位,newfile可以是文件或目錄;copy()使用copymode()拷貝許可權位,使用copyfile()拷貝文件內容

2.shutil.copy2("oldfile","newfile"):拷貝文件和狀態信息;copy2()使用copystat()拷貝元數據,使用copyfile()拷貝文件內容,複製後的結果保留了原來的所有信息(包括狀態信息)

3.shutil.copyfile("oldfile","newfile"):拷貝(複製)文件,oldfile和newfile都只能是文件,如果newfile不存在則自動創建;特殊文件比如塊設備、字元設備、管道不能使用此函數複製

4.shutil.copyfileobj(fsrc,fdst[,length]):將一個文件的內容拷貝的另外一個文件當中,可以指定length長度進行拷貝(不常用)

5.shutil.copymode(src,dst):僅拷貝許可權,內容、組、用戶均不變(不常用)

6.shutil.copystat(src,dst):拷貝狀態的信息,包括:mode bits,atime,mtime,flags(不常用)

7.shutil.copytree("olddir","newdir"):複製整個文件夾(目錄),無論文件夾是否為空,均可以複製,而且會複製文件夾中的所有內容,olddir和newdir都只能是目錄,且newdir必須不存在,若newdir文件夾已經存在,就會返回一個FileExistsError錯誤

8.shutil.move("oldpos","newpos"):移動文件/重命名文件

9.shutil.rmtree("dir"): 刪除文件夾(目錄),空目錄、有內容的目錄都可以刪(刪除的是文件夾)

【補充】:

    os.mkdir("file"):     創建目錄

   os.rename("oldname","newname"):重命名文件(目錄),文件或目錄都是使用這條命令

   os.remove("file"):  刪除文件

   os.rmdir("dir"):      刪除目錄,只能刪除空目錄    

   os.chdir("path") :  轉換目錄,換路徑

 1 import shutil
 2 
 3 shutil.copy("src.txt", "dst.txt")      # 輸出 'dst.txt'
 4 shutil.copy("src.txt", "/tmp/")        # 輸出 '/tmp/src.txt'
 5 shutil.copy("src.txt", "/Dota2/")      # 傳入一個不存在的目錄,出現IsADirectoryError:
 6  
 7 shutil.copy2("src.txt", "dst.txt")
 8 
 9 shutil.copyfile("src.txt", "dst.txt")
10 
11 shutil.copyfileobj(open("fsrc.txt", "rb"), open("fdst.txt", "wb"))
12 shutil.copymode('f1.log', 'f2.log')
13 shutil.copystat('f1.log', 'f2.log')
14 
15 shutil.copytree('folder1', 'folder2')  # 如果folder2文件夾已經存在,就會返回一個FileExistsError錯誤
16 
17 shutil.rmtree('folder1')               # 刪除文件夾folder1
18 
19 # 移動文件/重命名文件 shutil.move()
20 shutil.move('E:\\first\\123.txt', 'E:\\second') # 移動文件,輸出結果'E:\\second\\123.txt' 21 shutil.move('E:\\first\\123.txt', 'E:\\first\\aaa') # 重命名文件,輸出結果'E:\\first\\aaa'

演示os.chdir("path") :

 

1 # 使用os模塊,將當前工作目錄設置在E盤
2 
3 #假設當前路徑 C:\\Users\\first
4 
5 import os
6 
7 os.chdir('E:\\')    # 換路徑
8 
9 os.getcwd()    # 即可看到輸出結果為 'E:\\'

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、項目框架準備 1.1 新建maven空項目,併在pom中引入依賴 1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <v ...
  • 一、Set集合 1.HashSet底層實際上是一個HashMap,HashMap底層採用了哈希表數據結構。 2.哈希表又稱為散列表,哈希表底層是一個數組,這個數組中每一個元素是一個單向鏈表,每個單向鏈表都有一個獨一無二的hash值,代表數組的下標。在某個單向鏈表中的每一個節點上的hash值是相等的, ...
  • eureka註冊中心 一、基本概念 SpringCloud封裝 了Netflix公司的eureka作為自己微服務的註冊中心。這個註冊中心和dubbo中的zookeeper很相似,簡單來說,只要你可以將你的”微服務“模塊註冊到註冊中心,就可以供其他服務調用,一般來說,只有provider會註冊到eur ...
  • (1)BigIntege:實現任意精度的整數運算。(2)BigDecimal:實現任意精度的浮點運算。 例如: 使用BigDecimal進行浮點數比較 import java.math.BigDecimal; public class HelloWorld{ public static void m ...
  • 基本數據類型 1.整數類型(byte,short,int,long)2.浮點數類型(float,double)3.字元類型(char)4.布爾類型(boolean) 整數類型 --byte 使用byte關鍵字來定義byte型變數 例如: byte a=1; byte b=2,c=3; 整數型中分配空 ...
  • 一、對象導論 1:多態的可互換對象 面向對象程式設計語言使用了後期綁定的概念。 當向對象發送消息時,被調用的代碼直到運行時才能確定。也叫動態綁定。 2:單根繼承結構 所有的類最終都繼承自單一的基類,這個終極基類的名字就是Object 3:對象的創建和生命期 對象的數據處於作用域,Java完全採用了動 ...
  • 5種PHP生成圖片驗證碼實例,包括數字驗證碼、數字+字母驗證碼、中文驗證碼、仿google驗證碼和算術驗證碼,PHP生成驗證碼的原理:通過GD庫,生成一張帶驗證碼的圖片,並將驗證碼保存在Session中。 js驗證 1 $(function() { 2 $("#getcode_num").click ...
  • 一、前言 Xlinx的ZYNQ系列SOC集成了APU、各種專用外設資源和傳統的FPGA邏輯,為ARM+FPGA的應用提供助力,降低功耗和硬體設計難度的同時極大提高兩者間傳輸的帶寬。之前在研究生課題中使用過ZYNQ搭建環路系統對演算法進行板級驗證,但並沒有深入使用和理解這個異構平臺,今天算是對入門的總結 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...