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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...