文件的操作

来源:http://www.cnblogs.com/abobo/archive/2017/12/14/8035695.html
-Advertisement-
Play Games

操作文件時,一般需要經歷如下步驟: 打開文件操作文件 一、打開文件: 註:python中打開文件有兩種方式,即:open(...) 和 file(...) ,本質上前者在內部會調用後者來進行文件操作,推薦使用 open。 打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄, ...


操作文件時,一般需要經歷如下步驟:

打開文件
操作文件

 

一、打開文件:

1 文件句柄 = file('文件路徑', '模式')

註:python中打開文件有兩種方式,即:open(...) 和  file(...) ,本質上前者在內部會調用後者來進行文件操作,推薦使用 open

打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。

打開文件的模式有:

  • r,只讀模式(預設)。
  • w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
  • a,追加模式。【可讀;   不存在則創建;存在則只追加內容;】

"+" 表示可以同時讀寫某個文件

  • r+,可讀寫文件。【可讀;可寫;可追加】
  • w+,寫讀
  • a+,同a

"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示處理二進位文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進位文件時需標註)

  • rb
  • wb
  • ab

 

 

二、操作操作

1、讀寫文件: f = open('db','r')     #只讀 f = open('db','w')   #只寫,先清空原文件 f = open('db','x')   #如果文件存在,報錯,如果不存在,創建並寫內容 f = open('db','a')   #追加
 1 #####只讀#####
 2 
 3 #正好只讀方式打開(不包含“b”)
 4 f = open('yesterday','r',encoding='utf-8')
 5 data = f.read()
 6 print(data,type(data))
 7 f.close()
 8 
 9 #以二進位的方式讀取:(包含“b”)
10 f = open("yesterday",'rb')
11 data = f.read()
12 print(data,type(data))
13 
14 
15 
16 #####追加#####
17 
18 #二進位的方式追加寫入(包含“b”)
19 #二進位寫入的時候無需python進行轉換,但需要指定存入的字元集
20 f = open("yesterday",'ab')
21 f.write(bytes("李傑",encoding="utf-8"))
22 f.close()
23 
24 #字元串追加寫入(不包含“b”)
25 f = open("yesterday",'a')
26 f.write("李傑")
27 f.close()
28 
29 
30 
31 ############讀寫##############
32 #先讀,然後在寫
33 f = open("yesterday",'r+',encoding="utf-8")
34 data = f.read(1)
35 print(data)
36 f.write("777".strip())
37 f.close()
38 
39 
40 ###########指定位置讀寫############
41 #讀指定位置,進行寫入:(覆蓋指針後對應的字元)
42 f = open("yesterday",'r+',encoding="utf-8")
43 data = f.read(1)   #如果是r+b的方式打開read()讀取的是一個位元組,否則是一個字元
44 print(data)
45 f.seek(1)         #永遠是以位元組的方式找位置
46 f.write("777".strip())
47 f.close()
48 
49 
50 
51 #################在游標指定的位置進行插入##################
52 
53 f = open("yesterday",'r+',encoding="utf-8")
54 data = f.read(1)  #如果打開模式無b,則read,會按照字元讀取
55 print(f.tell())   #tell當前指針所在的位置(位元組)
56 f.seek(f.tell())  #調整到tell返回的指針的位置(位元組)
57 f.write("888")    #當前指針位置開始覆蓋
58 f.close()
59 
60 
61 #a+:讀寫,每次寫入都在最後開始追加
62 #w+:讀寫,每次寫入都會先清空原數據在寫入
  總結: 1、read() #無參數,讀全部。有參數:                                                          有b: 按位元組                                                          無b:按字元 2、tell():獲取當前指針位置(位元組) 3、seek():指針跳轉到指定位置(位元組) 4、write():寫數據,與打開方式有關係:                                                          有b: 按位元組                                                          無b:按字元 5、fileno:檢測文件是否發生變化。 6、flush():強制刷新。
###############強制刷新###################
f = open("yesterday",'a',encoding="utf-8")
f.write("aaaaaaaaaaa")
input("asdfghjkl:")
f.flush()

f = open("yesterday",'r',encoding="utf-8")
print(f.read())
7、readline():僅讀取一行,一次只讀取一行 8、truncate():截斷,指針位置後面全部清空。
1 ################截斷指針位置後面的被清空################
2 f = open("yesterday",'r+',encoding="utf-8")
3 f.seek(3)
4 f.truncate()
5 f.close()

9、打開一個文件,通過迴圈這個對象的時候,會一行一行的迭代這個文件句柄:

#####################for迴圈文件對象#########################
#註意:防止大文件沖刷記憶體
f = open("yesterday",'r+',encoding="utf-8")
for line in f:
    print(line)

 

三、關閉文件
通過close關閉:
f.close()

 

三、使用with進行操作:

特點:

1、with可以同時打開2個文件進行操作:
2、with執行完後代碼塊會自動個關閉無需,f.close():

 1 ##################一個文件讀,一個文件寫####################
 2 #用途:1、備份某個文件;2、在某個文件中間添加數據;3、提取文件某行記錄
 3 with open("yesterday",'r',encoding="utf-8") as f,open("yesterday2",'w',encoding="utf-8") as f1:
 4     count = 0
 5     for line in f:
 6 
 7         print(line)
 8         if count <= 9:
 9             f1.write(line)
10             count += 1
11         else:
12             break
13 
14 
15 
16 ####################文件備份################################
17 #f1文件替換數據並導入到f2文件
18 with open("yesterday",'r',encoding="utf-8") as f1,open("yesterday2",'w',encoding="utf-8") as f2:
19     for line in f1:
20         new_str = line.replace("","Abiao")
21         f2.write(new_str)
22 
23 with open("yesterday2",'r',encoding="utf-8") as f3:
24     for line in f3:
25         print(line.strip('\n'))
26 
27 
28 ######################加入判斷的文件備份###############################
29 
30 with open("yesterday",'r',encoding="utf-8") as f1,open("yesterday2",'w',encoding="utf-8") as f2:
31     for line in f1:
32         if "" in line:
33             new_str = line.replace("","alex")
34             f2.write(new_str)
35 
36 with open("yesterday2",'r',encoding="utf-8") as f3:
37     for line in f3:
38         print(line)

 

四、文件操作的源代碼:

  1 class file(object):
  2   
  3     def close(self): # real signature unknown; restored from __doc__
  4         關閉文件
  5         """
  6         close() -> None or (perhaps) an integer.  Close the file.
  7          
  8         Sets data attribute .closed to True.  A closed file cannot be used for
  9         further I/O operations.  close() may be called more than once without
 10         error.  Some kinds of file objects (for example, opened by popen())
 11         may return an exit status upon closing.
 12         """
 13  
 14     def fileno(self): # real signature unknown; restored from __doc__
 15         文件描述符  
 16          """
 17         fileno() -> integer "file descriptor".
 18          
 19         This is needed for lower-level file interfaces, such os.read().
 20         """
 21         return 0    
 22  
 23     def flush(self): # real signature unknown; restored from __doc__
 24         刷新文件內部緩衝區
 25         """ flush() -> None.  Flush the internal I/O buffer. """
 26         pass
 27  
 28  
 29     def isatty(self): # real signature unknown; restored from __doc__
 30         判斷文件是否是同意tty設備
 31         """ isatty() -> true or false.  True if the file is connected to a tty device. """
 32         return False
 33  
 34  
 35     def next(self): # real signature unknown; restored from __doc__
 36         獲取下一行數據,不存在,則報錯
 37         """ x.next() -> the next value, or raise StopIteration """
 38         pass
 39  
 40     def read(self, size=None): # real signature unknown; restored from __doc__
 41         讀取指定位元組數據
 42         """
 43         read([size]) -> read at most size bytes, returned as a string.
 44          
 45         If the size argument is negative or omitted, read until EOF is reached.
 46         Notice that when in non-blocking mode, less data than what was requested
 47         may be returned, even if no size parameter was given.
 48         """
 49         pass
 50  
 51     def readinto(self): # real signature unknown; restored from __doc__
 52         讀取到緩衝區,不要用,將被遺棄
 53         """ readinto() -> Undocumented.  Don't use this; it may go away. """
 54         pass
 55  
 56     def readline(self, size=None): # real signature unknown; restored from __doc__
 57         僅讀取一行數據
 58         """
 59         readline([size]) -> next line from the file, as a string.
 60          
 61         Retain newline.  A non-negative size argument limits the maximum
 62         number of bytes to return (an incomplete line may be returned then).
 63         Return an empty string at EOF.
 64         """
 65         pass
 66  
 67     def readlines(self, size=None): # real signature unknown; restored from __doc__
 68         讀取所有數據,並根據換行保存值列表
 69         """
 70         readlines([size]) -> list of strings, each a line from the file.
 71          
 72         Call readline() repeatedly and return a list of the lines so read.
 73         The optional size argument, if given, is an approximate bound on the
 74         total number of bytes in the lines returned.
 75         """
 76         return []
 77  
 78     def seek(self, offset, whence=None): # real signature unknown; restored from __doc__
 79         指定文件中指針位置
 80         """
 81         seek(offset[, whence]) -> None.  Move to new file position.
 82          
 83         Argument offset is a byte count.  Optional argument whence defaults to
 84         0 (offset from start of file, offset should be >= 0); other values are 1
 85         (move relative to current position, positive or negative), and 2 (move
 86         relative to end of file, usually negative, although many platforms allow
 87         seeking beyond the end of a file).  If the file is opened in text mode,
 88         only offsets returned by tell() are legal.  Use of other offsets causes
 89         undefined behavior.
 90         Note that not all file objects are seekable.
 91         """
 92         pass
 93  
 94     def tell(self): # real signature unknown; restored from __doc__
 95         獲取當前指針位置
 96         """ tell() -> current file position, an integer (may be a long integer). """
 97         pass
 98  
 99     def truncate(self, size=None): # real signature unknown; restored from __doc__
100         截斷數據,僅保留指定之前數據
101         """
102         truncate([size]) -> None.  Truncate the file to at most size bytes.
103          
104         Size defaults to the current file position, as returned by tell().
105         """
106         pass
107  
108     def write(self, p_str): # real signature unknown; restored from __doc__
109         寫內容
110         """
111         write(str) -> None.  Write string str to file.
112          
113         Note that due to buffering, flush() or close() may be needed before
114         the file on disk reflects the data written.
115         """
116         pass
117  
118     def writelines(self, sequence_of_strings): # real signature unknown; restored from __doc__
119         將一個字元串列表寫入文件
120         """
121         writelines(sequence_of_strings) -> None.  Write the strings to the file.
122          
123         Note that newlines are not added.  The sequence can be any iterable object
124         producing strings. This is equivalent to calling write() for each string.
125         """
126         pass
127  
128     def xreadlines(self): # real signature unknown; restored from __doc__
129         可用於逐行讀取文件,非全部
130         """
131         xreadlines() -> returns self.
132          
133         For backward compatibility. File objects now include the performance
134         optimizations previously implemented in the xreadlines module.
135         """
136         pass
View Code

 

 

五、不推薦使用的參數:

**************************************以下函數不推薦使用***********************************************

#以list的方式顯示文件句柄:(讀小文件)
註意:將整個文件讀取到記憶體中,因此只能讀小文件
f = open("yesterday",'r',encoding="utf-8")
print(f.readlines())


#載入整個文件數據到記憶體,以list方式迴圈句柄:
for line in f.readlines():
    print(line.strip())   #並去掉換行和首尾空格


#列印文本句柄,在第5行的時候顯示分割線:
#比較 low的迴圈,因為在大文件讀取的時候會直接把數據一次性載入到記憶體,會導致記憶體撐爆。
#放棄這種方式:
f = open("yesterday",'r',encoding="utf-8")
for index,line in enumerate(f.readlines()):
    if index == 4:
        print("---------------分割線------------------")
        continue
    print(line.strip())

**************************************以上函數不推薦使用***********************************************

 

六、文件操作常用的參數: 1、寫入、創建、並覆蓋原文件內容:(w:寫入並創建,覆蓋原本內容。)
1 f = data = open("yesterday2",'w',encoding="utf-8") #文件句柄:文件變數 = (包含:文件名、打開文件的模式、字元集、大小、記憶體的起始位置)
2 f_w = f.write("我愛北京天安門 \n")
3 f_w = f.write("天安門上太陽升 \n")
4 f.close()

 

2、追加文件內容:(a:)

1 f = open("yesterday2",'a',encoding="utf-8") #文件句柄:文件變數 = (包含:文件名、打開文件的模式、字元集、大小、記憶體的起始位置)
2 f.write("\nwhen i was young i listen to the redio\n")
3 r_f = f.read()
4 print(r_f)
5 f.close()

 

3、讀和寫追加模式(r+):用處最多
#註意:以r+的方式打開,在寫入字元時,是在後面追加

1 f = open("yesterday2",'r+',encoding="utf-8")
2 print(f.readline())
3 print(f.readline())
4 print(f.readline()) #讀取三行
5 print(f.tell())     #列印游標
6 f.write("-------diao--------")  #寫入字元

 

 

4、寫讀方式打開(用處不大)

#刪除就文件,創建新文件,寫入時往後追加 #註意:在2.0的版本里源文件的修改是直接覆蓋掉源字元,3.0後只能追加寫

 

 1 f = open("yesterday2",'w+',encoding="utf-8")
 2 f.write("-------------diao------------1\n")
 3 f.write("-------------diao------------1\n")
 4 f.write("-------------diao------------1\n")
 5 f.write("-------------diao------------1\n")
 6 f.write("-------------diao------------1\n")
 7 print(f.tell())
 8 f.seek(10)
 9 print(f.tell())
10 print(f.readline())
11 f.write("aaaaaaaaaaaaaaaaaaaaaaaaaa")
12 f.close()

 

 

5、追加讀寫:

 1 f = open("yesterday2",'a+',encoding="utf-8")
 2 f.write("---------diao-------1\n")
 3 f.write("---------diao-------1\n")
 4 f.write("---------diao-------1\n")
 5 f.write("---------diao-------1\n")
 6 print(f.tell())
 7 f.seek(15)
 8 print(f.tell())
 9 print(f.readline())
10 f.write("bbbbbbbbbbbbbbbbbbbbbb")
11 f.close()

 

6、以二進位格式讀取文件句柄:

#以二進位方式讀取不需要加字元集 #用途: #1、網路傳輸時只能用二進位格式:(2.0里還能用字元,3.0修正) #2、需要打開二進位文件的時候使用:(二進位文件以字元形式打開會造成文件損壞)

 

1 f = open("yesterday2",'rb')
2 print(f.readline())
3 print(f.readline())

 

 

7、寫二進位:

 

#直接寫字元是不行的,需要做字元和數字轉換:

 

#文件內容不是0101的方式,而是以二進位的方式進行處理
1 f = open("yesterday2",'wb')
2 f.write("hello binary\n".encode(encoding='utf-8'))
3 f.close()
 

 

8、列印游標位置

 

#註意游標到文本最後一行,會在繼續讀,由於後面的東西沒有導致游標無法讀出東西。

 

#因此需要將游標移動到一開始的位置。
1 f = open("yesterday",'r',encoding="utf-8")
2 print(f.tell())
3 #print(f.readline())   #有多少個字元就記錄多少個數。
4 print(f.read(5))       #read()預設不輸入東西,就表示所有,()里的5代表只讀5個字元
5 print(f.tell())        #列印游標在哪個位置

 

9、指定游標返回到某個位置。

#讀了多行,返回游標。

1 f = open("yesterday",'r',encoding="utf-8")
2 print(f.tell())
3 print(f.readline())  #讀三行
4 print(f.readline())
5 print(f.readline())
6 print(f.tell())
7 f.seek(10)            #指定游標退回到那個位置上(前提要知道游標退回的位置)
8 print(f.readline())   #從當前的位置到第一個換行符列印出來

 

10、列印文件的編碼:

 1 print(f.encoding) 

 

11、如果能移動游標就返回True,如果不能就返回False

# 不是所有的文件都能移動游標的,有些二進位的文件是無法讀取的。

 1 print(f.seekable()) 

 

12、判斷文件是否可讀:

#如果可讀返回True,如果不可讀返回為false。

 1 print(f.readable()) 

 

13、判斷文件是否可寫:

#如果可寫返回True,如果不可寫返回false。  1 print(f.writable()) 

 

14、刷新緩存的數據落盤

#在更新數據時,數據時存放在記憶體中的,防止記憶體數據丟失,則使用flush()進行刷新 #使用場景:要求數據必須實時的落盤。
1 f = open("yesterday2",'a+',encoding="utf-8")
2 f.write("hello\n")  #寫入的數據放在緩存里
3 f.flush()           #刷新緩存落盤
4 f.write("hello2\n")

 

 

15、判斷文件是否關閉了:

關閉返回True,沒關閉返回False  1 print(f.closed)      16、清空文件內容: #從第20個字元截斷,保存前面字元,去掉後面的
1 f = open("yesterday2",'a+',encoding="utf-8")
2 f.truncate(20)

 

 


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

-Advertisement-
Play Games
更多相關文章
  • ul li { position:relative; display: table; width:3rem; height:3rem; background:url('image/defaultBg.jpg') 0 0/100% 100% no-repeat; float:le... ...
  • 1、概述 Iterator 的作用有三個:一是為各種數據結構,提供一個統一的、簡便的訪問介面;二是使得數據結構的成員能夠按某種次序排列;三是 ES6 創造了一種新的遍歷命令for...of迴圈,Iterator 介面主要供for...of迴圈。 2、Iterator 介面 ES6 的有些數據結構原生 ...
  • 問題描述:在vue項目中運行npm run dev啟動伺服器,然而在同一個區域網下的外部設備不能該伺服器 解決方案:在項目的config文件夾下找到index .js中的host把預設的localhost更改為0.0.0.0, 然後外部設備就可以訪問該項目啟動的服務了(註意必須是在統一區域網下) ...
  • 概念: 單例模式:一個類中只有一個實例。 一個類有且僅有一個實例,並且提供了一個全局的訪問點。 使用該模式的起因: 當我們在瀏覽網站時,有些網站會顯示“當前線上人數”。通常,實現這個功能的辦法是將登陸的每一個IP存儲在一個記憶體、文件或者資料庫中,每多一個IP,就實現“+1”。一般就是用一個方法,比如 ...
  • 函數的創建與執行過程 1、當兩個函數名都一樣時,下麵調用函數則會按照最後一個函數體進行調用。2、第一個函數則會變成垃圾記憶體,被python內部的垃圾清理機制給清除掉。3、執行過程如下圖: 函數的參數在傳遞的時候,傳遞的是引用,還是一個值?(答案:引用) 函數在傳參是,引用與傳值的區別: 1、在函數傳 ...
  • 回顧 一、參數的種類: 1、靜態參數: (1)、普通參數:嚴格按照順序,將實際參數複製給形式參數。 (2)、預設參數:一定要放在參數列的最後(即普通參數後面)。 註意: 給預設參數傳參,會被覆蓋掉(例如:XX = OK被BB覆蓋) 預設參數一定要放到,所有參數的末尾否則報錯。 (3)、指定參數:講實 ...
  • 回顧 1、set集合的特點:去重,無序,可嵌套。2、函數:def,參數,名字,函數體,返回值。3、如果是定義函數,則函數體是不會執行的,只有在調用的時候才會執行。 參數的種類 a、普通參數:嚴格按照順序,將實際參數複製給形式參數。 b、預設參數:一定要放在參數列的最後(即普通參數後面)。 註意: 給 ...
  • 編程方法類型 1、面向對象:以類為主要思路,定義的關鍵字class 2、面向過程:以過程為主的思路,定義的關鍵字為def 3、函數式編程:(最早)以函數為主要思路,定義的關鍵字為def 註意:過程和函數的區別就是:過程沒有return 函數式編程的優勢 1、減少代碼的重覆使用: 2、方便代碼的可擴展 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...