操作文件時,一般需要經歷如下步驟: 打開文件操作文件 一、打開文件: 註: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 passView 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)