文件操作 文件操作也是編程中需要熟練掌握的技能,尤其是在後臺介面編寫和數據分析過程中,對各種類型的文件進行操作,獲取文件信息或者對信息進行存儲是十分重要的。本篇博客中將主要對常見的文本格式文件和Excel文件的相關操作進行介紹。 一、文本文件 1.1 文件操作流程 1、打開文件,獲得文件句柄,並賦值 ...
文件操作
文件操作也是編程中需要熟練掌握的技能,尤其是在後臺介面編寫和數據分析過程中,對各種類型的文件進行操作,獲取文件信息或者對信息進行存儲是十分重要的。本篇博客中將主要對常見的文本格式文件和Excel文件的相關操作進行介紹。
一、文本文件
1.1 文件操作流程
1、打開文件,獲得文件句柄,並賦值給一個變數 ;
2、通過句柄對文件進行相關操作;
3、關閉文件
示例:
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2018/8/23 4 5 f = open('動物世界.txt','r',encoding='utf-8') 6 content = f.read() 7 print(content) 8 f.close() 9 10 #***************運行結果***************** 11 ''' 12 東打一下西戳一下 13 動物未必需要尖牙 14 示愛的方法有禮貌或是我管它 15 要將情人一口吞下 16 還要顯得溫文爾雅 17 螳螂委屈的展示舊傷疤 18 ...... 19 '''
open函數中,第一個參數為文件存儲的位置+文件名(我在本地測試時文件與代碼同級),第二個參數為文件的操作模式,第三個參數為操作的編碼方式。
註意:文件是utf8保存的,打開文件時open函數是通過操作系統打開的文件,而win操作系統預設的是gbk編碼,所以直接打開會亂碼,需要encoding='utf8'。文件如果是gbk保存的,則直接打開即可。
1.2 文件的操作模式
========= =============================================================== Character Meaning --------- --------------------------------------------------------------- 'r' open for reading (default) 'w' open for writing, truncating the file first 'x' create a new file and open it for writing 'a' open for writing, appending to the end of the file if it exists 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) 'U' universal newline mode (deprecated) ========= ===============================================================
示例:
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/1/21 4 5 # 只讀文件 6 f = open('a.txt','r',encoding='utf-8') 7 f.read() 8 f.close() 9 10 # 只寫文件 11 # 註意: 1.若無該文件,寫文件操作時會自動創建;2.再次寫入時會從開頭寫,將原來的內容覆蓋 12 f = open('a.txt','w',encoding='utf-8') 13 f.write('helloll') 14 f.close() 15 16 # 以追加模式寫入,會接著上一次的地方繼續寫 17 f = open('a.txt','a',encoding='utf-8') 18 f.write('123456879') 19 f.close() 20 21 # 以讀寫的模式操作文件 22 f = open('a.txt','r+',encoding='utf-8') 23 f.read(5) 24 f.write('233333') 25 f.read() 26 f.close() 27 28 # 以寫讀的模式操作文件 29 f = open('a.txt','w+') 30 print(f.read(5)) # 什麼都沒有,因為先格式化了文本 31 f.write('hello cdc') 32 print(f.read()) #還是read不到 33 f.seek(0) 34 print(f.read()) 35 36 # 以二進位方式讀文件 37 f = open('a.txt','rb') 38 content = f.read() 39 print(type(content)) 40 f.close() 41 42 # 以二進位方式寫文件 43 f = open('a.txt','wb') 44 f.write('hello alvin!'.encode()) 45 f.close()
1.3 文件操作的具體方法
文件內容的讀取:
1 f.read() # 將文件內容全部讀出來 2 f.read(5) # 讀取五個位元組的內容 3 f.readline() # 讀取一行 4 f.readlines() # 將所有內容以換行符為準分割,形成一個列表對象
查看游標位置及游標操作:
1 #查看游標當前位置 2 f = open("a.txt","r",encoding="utf8") 3 print(f.tell()) 4 print(f.read(5)) 5 #一個中文預設為是三個字元 6 print(f.tell()) 7 f.seek(0) #調整游標位置 8 print(f.read(5))
1 f = open('a.txt', 'rb', ) 2 f.read(3) 3 f.seek(3) 4 print(f.read(3)) 5 6 f.seek(3,1) # 1為從當前位置,移動3個位元組 7 print(f.read(3)) 8 9 f.seek(-4,2) # 2為從從文件末尾算,向前移動4個位元組 10 print(f.read(3)) 11 f.close()
flush操作:將緩衝區的內容刷新到終端
1 import sys,time 2 for i in range(30): 3 sys.stdout.write("*") #在緩衝區內寫內容 4 sys.stdout.flush() #將緩衝區內容刷新到終端顯示 5 print("*",end='',flush=True) 6 time.sleep(0.2) 7 f = open("小重山","w",encoding="utf8") 8 f.truncate() #截斷操作,只保留游標前的內容,不設置參數時預設游標位置為0
1.4 with方法
為了避免打開文件後忘記關閉,可以通過管理上下文,即:
1 with open('a.txt','r',encoding='utf-8') as f: 2 f.readline()
如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。with支持同時對多個文件的上下文進行管理,即:
1 with open('a.txt','r',encoding='utf-8') as f_read, open('b.txt','w',encoding='utf-8') as f_write: 2 f_read.readline() 3 f_write.write('hello')
1.5 踩坑啦!!!
對於文件的讀取操作,本人在公司遇到過不少的麻煩。。。由於每個人使用的文本編輯器不同,並且不是所有人都能關註到語言格式的問題,所以往往存儲的文件編碼格式五花八門,等到這些數據到我手裡需要處理的時候。。。我的內心 (▼ヘ▼#) (╯°Д°)╯︵┻━┻
起初我打算自己寫一套腳本來識別各種語言格式並統一轉化成utf-8格式,無奈編碼格式實在是太多種了,很難判斷完全。後來我發現有一個非常巧妙的方法:
1 with open('filename','r',encoding='iso-8859-1') as f: 2 for line in f.readlines(): 3 content = bytes.decode(line.encode('utf-8')) 4 print(type(content))
以'iso-8859-1'的編碼方式去讀取文件,無論哪種編碼格式的文件都可以以bytes類型的形式被讀取出來,接著只要再將bytes轉換成str,並以'utf-8'格式編碼就大功告成了!
還有一種情況,在已經知道文件是以'utf-8'編碼格式存儲的情況下,以'utf-8'方式去讀取還是報錯:
1 with open('a.txt','r',encoding='utf-8') as f: 2 for i in f.readlines(): 3 print(i) 4 5 # 結果報錯 6 #'\ufeffHello,World\n'
a.txt的文件編碼格式為utf-8,但是讀取的第一行前面會出現非法字元'\ufeff',後來發現是utf-8編碼有無BOM的原因造成的。BOM,即Byte Order Mark,就是位元組序標記,具體原理感興趣的童鞋可以谷歌瞭解一下!遇到這種情況只需要在讀取文件的時候如下操作即可:
1 with open('a.txt', 'r', encoding='utf-8-sig') as f: 2 for i in f.readlines(): 3 print(i)