Python 文件操作的詳解及實例
一、文件操作
1、對文件操作流程
現有文件如下:
昨夜寒蛩不住鳴。驚回千里夢,已三更。起來獨自繞階行。人悄悄,簾外月朧明。白首為功名,舊山松竹老,阻歸程。欲將心事付瑤琴。知音少,弦斷有誰聽。f = open('小重山') #打開文件data=f.read()#獲取文件內容f.close() #關閉文件注意:if in the win,hello文件是utf8保存的,打開文件時open函數是通過操作系統打開的文件,而win操作系統默認的是gbk編碼,所以直接打開會亂碼,需要f=open(‘hello',encoding='utf8'),hello文件如果是gbk保存的,則直接打開即可。
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)
先介紹三種最基本的模式:
# f = open('小重山2','w') #打開文件# f = open('小重山2','a') #打開文件# f.write('莫等閑1/n')# f.write('白了少年頭2/n')# f.write('空悲切!3')3、文件具體操作
f = open('小重山') #打開文件# data1=f.read()#獲取文件內容# data2=f.read()#獲取文件內容## print(data1)# print('...',data2)# data=f.read(5)#獲取文件內容# data=f.readline()# data=f.readline()# print(f.__iter__().__next__())# for i in range(5):# print(f.readline())# data=f.readlines()# for line in f.readlines():# print(line)# 問題來了:打印所有行,另外第3行后面加上:'end 3'# for index,line in enumerate(f.readlines()):# if index==2:# line=''.join([line.strip(),'end 3'])# print(line.strip())#切記:以后我們一定都用下面這種# count=0# for line in f:# if count==3:# line=''.join([line.strip(),'end 3'])# print(line.strip())# count+=1# print(f.tell())# print(f.readline())# print(f.tell())#tell對于英文字符就是占一個,中文字符占三個,區分與read()的不同.# print(f.read(5))#一個中文占三個字符# print(f.tell())# f.seek(0)# print(f.read(6))#read后不管是中文字符還是英文字符,都統一算一個單位,read(6),此刻就讀了6個中文字符#terminal上操作:f = open('小重山2','w')# f.write('hello /n')# f.flush()# f.write('world')# 應用:進度條# import time,sys# for i in range(30):# sys.stdout.write("*")# # sys.stdout.flush()# time.sleep(0.1)# f = open('小重山2','w')# f.truncate()#全部截斷# f.truncate(5)#全部截斷# print(f.isatty())# print(f.seekable())# print(f.readable())f.close() #關閉文件接下來我們繼續擴展文件模式:
# f = open('小重山2','w') #打開文件# f = open('小重山2','a') #打開文件# f.write('莫等閑1/n')# f.write('白了少年頭2/n')# f.write('空悲切!3')# f.close()#r+,w+模式# f = open('小重山2','r+') #以讀寫模式打開文件# print(f.read(5))#可讀# f.write('hello')# print('------')# print(f.read())# f = open('小重山2','w+') #以寫讀模式打開文件# print(f.read(5))#什么都沒有,因為先格式化了文本# f.write('hello alex')# print(f.read())#還是read不到# f.seek(0)# print(f.read())#w+與a+的區別在于是否在開始覆蓋整個文件# ok,重點來了,我要給文本第三行后面加一行內容:'hello 岳飛!'# 有同學說,前面不是做過修改了嗎? 大哥,剛才是修改內容后print,現在是對文件進行修改!!!# f = open('小重山2','r+') #以寫讀模式打開文件# f.readline()# f.readline()# f.readline()# print(f.tell())# f.write('hello 岳飛')# f.close()# 和想的不一樣,不管事!那涉及到文件修改怎么辦呢?# f_read = open('小重山','r') #以寫讀模式打開文件# f_write = open('小重山_back','w') #以寫讀模式打開文件# count=0# for line in f_read: # if count==3: # f_write.write('hello,岳飛/n') # # else: # f_write.write(line) # another way: # if count==3: # # line='hello,岳飛2/n' # f_write.write(line) # count+=1# #二進制模式# f = open('小重山2','wb') #以二進制的形式讀文件# # f = open('小重山2','wb') #以二進制的形式寫文件# f.write('hello alvin!'.encode())#b'hello alvin!'就是一個二進制格式的數據,只是為了觀看,沒有顯示成010101的形式注意1: 無論是py2還是py3,在r+模式下都可以等量字節替換,但沒有任何意義的!
注意2:有同學在這里會用readlines得到內容列表,再通過索引對相應內容進行修改,最后將列表重新寫會該文件。
這種思路有一個很大的問題,數據若很大,你的內存會受不了的,而我們的方式則可以通過迭代器來優化這個過程。
補充:rb模式以及seek
在py2中:
#昨夜寒蛩不住鳴.f = open('test','r',) #以寫讀模式打開文件f.read(3)# f.seek(3)# print f.read(3) # 夜# f.seek(3,1)# print f.read(3) # 寒# f.seek(-4,2)# print f.read(3) # 鳴在py3中:
# test: 昨夜寒蛩不住鳴.f = open('test','rb',) #以寫讀模式打開文件f.read(3)# f.seek(3)# print(f.read(3)) # b'/xe5/xa4/x9c'# f.seek(3,1)# print(f.read(3)) # b'/xe5/xaf/x92'# f.seek(-4,2)# print(f.read(3)) # b'/xe9/xb8/xa3'#總結: 在py3中,如果你想要字符數據,即用于觀看的,則用r模式,這樣我f.read到的數據是一個經過decode的# unicode數據; 但是如果這個數據我并不需要看,而只是用于傳輸,比如文件上傳,那么我并不需要decode# 直接傳送bytes就好了,所以這個時候用rb模式.# 在py3中,有一條嚴格的線區分著bytes和unicode,比如seek的用法,在py2和py3里都是一個個字節的seek,# 但在py3里你就必須聲明好了f的類型是rb,不允許再模糊.#建議: 以后再讀寫文件的時候直接用rb模式,需要decode的時候仔顯示地去解碼.4、with語句
為了避免打開文件后忘記關閉,可以通過管理上下文,即:
with open('log','r') as f: pass如此方式,當with代碼塊執行完畢時,內部會自動關閉并釋放文件資源。
在Python 2.7 后,with又支持同時對多個文件的上下文進行管理,即:
with open('log1') as obj1, open('log2') as obj2: pass2如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答