Python 文件操作的詳解及實例
Python 文件操作的詳解及實例
一、文件操作
1、對文件操作流程
- 打開文件,得到文件句柄并賦值給一個變量
- 通過句柄對文件進(jìn)行操作
- 關(guān)閉文件
現(xiàn)有文件如下:
昨夜寒蛩不住鳴。
驚回千里夢,已三更。
起來獨自繞階行。
人悄悄,簾外月朧明。
白首為功名,舊山松竹老,阻歸程。
欲將心事付瑤琴。
知音少,弦斷有誰聽。
f = open('小重山') #打開文件
data=f.read()#獲取文件內(nèi)容
f.close() #關(guān)閉文件
注意:if in the win,hello文件是utf8保存的,打開文件時open函數(shù)是通過操作系統(tǒng)打開的文件,而win操作系統(tǒng)默認(rèn)的是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()#獲取文件內(nèi)容
# data2=f.read()#獲取文件內(nèi)容
#
# print(data1)
# print('...',data2)
# data=f.read(5)#獲取文件內(nèi)容
# 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對于英文字符就是占一個,中文字符占三個,區(qū)分與read()的不同.
# print(f.read(5))#一個中文占三個字符
# print(f.tell())
# f.seek(0)
# print(f.read(6))#read后不管是中文字符還是英文字符,都統(tǒng)一算一個單位,read(6),此刻就讀了6個中文字符
#terminal上操作:
f = open('小重山2','w')
# f.write('hello \n')
# f.flush()
# f.write('world')
# 應(yīng)用:進(jìn)度條
# 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() #關(guān)閉文件
接下來我們繼續(xù)擴(kuò)展文件模式:
# 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+的區(qū)別在于是否在開始覆蓋整個文件
# ok,重點來了,我要給文本第三行后面加一行內(nèi)容:'hello 岳飛!'
# 有同學(xué)說,前面不是做過修改了嗎? 大哥,剛才是修改內(nèi)容后print,現(xiàn)在是對文件進(jìn)行修改!!!
# 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
# #二進(jìn)制模式
# f = open('小重山2','wb') #以二進(jìn)制的形式讀文件
# # f = open('小重山2','wb') #以二進(jìn)制的形式寫文件
# f.write('hello alvin!'.encode())#b'hello alvin!'就是一個二進(jìn)制格式的數(shù)據(jù),只是為了觀看,沒有顯示成010101的形式
注意1: 無論是py2還是py3,在r+模式下都可以等量字節(jié)替換,但沒有任何意義的!
注意2:有同學(xué)在這里會用readlines得到內(nèi)容列表,再通過索引對相應(yīng)內(nèi)容進(jìn)行修改,最后將列表重新寫會該文件。
這種思路有一個很大的問題,數(shù)據(jù)若很大,你的內(nèi)存會受不了的,而我們的方式則可以通過迭代器來優(yōu)化這個過程?!?/p>
補(bǔ)充: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'
#總結(jié): 在py3中,如果你想要字符數(shù)據(jù),即用于觀看的,則用r模式,這樣我f.read到的數(shù)據(jù)是一個經(jīng)過decode的
# unicode數(shù)據(jù); 但是如果這個數(shù)據(jù)我并不需要看,而只是用于傳輸,比如文件上傳,那么我并不需要decode
# 直接傳送bytes就好了,所以這個時候用rb模式.
# 在py3中,有一條嚴(yán)格的線區(qū)分著bytes和unicode,比如seek的用法,在py2和py3里都是一個個字節(jié)的seek,
# 但在py3里你就必須聲明好了f的類型是rb,不允許再模糊.
#建議: 以后再讀寫文件的時候直接用rb模式,需要decode的時候仔顯示地去解碼.
4、with語句
為了避免打開文件后忘記關(guān)閉,可以通過管理上下文,即:
with open('log','r') as f:
pass
如此方式,當(dāng)with代碼塊執(zhí)行完畢時,內(nèi)部會自動關(guān)閉并釋放文件資源。
在Python 2.7 后,with又支持同時對多個文件的上下文進(jìn)行管理,即:
with open('log1') as obj1, open('log2') as obj2:
pass2
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 簡單文件操作python 修改文件指定行的方法
- Python 文件操作技巧(File operation) 實例代碼分析
- Python文件操作,open讀寫文件,追加文本內(nèi)容實例
- Python 文件操作實現(xiàn)代碼
- Python復(fù)制文件操作實例詳解
- Python常見文件操作的函數(shù)示例代碼
- Python實現(xiàn)的讀取/更改/寫入xml文件操作示例
- Python中shutil模塊的常用文件操作函數(shù)用法示例
- python讀寫文件操作示例程序
- 使用Python進(jìn)行穩(wěn)定可靠的文件操作詳解
- 詳解Python中的文件操作
- 使用Python對Csv文件操作實例代碼
- python 文件操作刪除某行的實例
- Python讀取properties配置文件操作示例
- python with statement 進(jìn)行文件操作指南
- python解析xml文件操作實例
- Python文件操作類操作實例詳解
- Python文件操作方法詳解
相關(guān)文章
用python修改excel表某一列內(nèi)容的操作方法
這篇文章主要介紹了用python修改excel表某一列內(nèi)容的操作代碼,在實現(xiàn)過程中用到openpyxl這個庫,要生成隨機(jī)數(shù)就要有random這個庫,具體代碼跟隨小編一起看看吧2021-06-06
使用Python爬取小姐姐圖片(beautifulsoup法)
這篇文章主要介紹了Python爬取小姐姐圖片(beautifulsoup法),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
python如何使用socketserver模塊實現(xiàn)并發(fā)聊天
這篇文章主要介紹了python如何使用socketserver模塊實現(xiàn)并發(fā)聊天,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
anaconda虛擬環(huán)境默認(rèn)路徑的更改圖文教程
在Anaconda中如果沒有指定路徑,虛擬環(huán)境會默認(rèn)安裝在anaconda所安裝的目錄下,這篇文章主要給大家介紹了關(guān)于anaconda虛擬環(huán)境默認(rèn)路徑更改的相關(guān)資料,需要的朋友可以參考下2023-10-10
Spring http服務(wù)遠(yuǎn)程調(diào)用實現(xiàn)過程解析
這篇文章主要介紹了Spring http服務(wù)遠(yuǎn)程調(diào)用實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
python 動態(tài)調(diào)用函數(shù)實例解析
這篇文章主要介紹了python 動態(tài)調(diào)用函數(shù)實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10

