python基礎(chǔ)之文件操作
1、打開(kāi)文件
open()函數(shù)簡(jiǎn)介 :
打開(kāi)文件使用open函數(shù),可以打開(kāi)一個(gè)已經(jīng)存在的文件,如果沒(méi)有這個(gè)文件的話,會(huì)創(chuàng)建一個(gè)新文件
完整的語(yǔ)法格式為:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數(shù)說(shuō)明:(一般只會(huì)用到前三個(gè)) file: 必需,文件路徑(相對(duì)或者絕對(duì)路徑)。 mode: 可選,文件打開(kāi)模式 encoding: 一般使用utf8 buffering: 設(shè)置緩沖 errors: 報(bào)錯(cuò)級(jí)別 newline: 區(qū)分換行符 closefd: 傳入的file參數(shù)類型 opener: 設(shè)置自定義開(kāi)啟器,開(kāi)啟器的返回值必須是一個(gè)打開(kāi)的文件描述符。
- mode模式
''' 文件打開(kāi)模式 r 以只讀方式打開(kāi)文件,文件的指針將會(huì)放在文件的開(kāi)頭,這是默認(rèn)模式。 w 打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已經(jīng)存在則將其覆蓋,如果不存在,創(chuàng)建新文件。 r+ 打開(kāi)一個(gè)文件用于讀寫(xiě),文件指針將會(huì)被放在文件的開(kāi)頭。 w+ 打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已經(jīng)存在則將其覆蓋,如果不存在,創(chuàng)建新文件。 rb+ 以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。文件指針將會(huì)放在文件的開(kāi)頭。 wb+ 以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已經(jīng)存在則將其覆蓋,如果不存在,創(chuàng)建新文件。 a 打開(kāi)一個(gè)文件用于追加,如果文件已經(jīng)存在,文件指針將會(huì)放在文件的結(jié)尾,也就是說(shuō),新的內(nèi)容將會(huì)被寫(xiě)到已有內(nèi)容之后。 如果文件不存在,創(chuàng)建新的文件進(jìn)行寫(xiě)入。 '''
- encoding編碼類型
encoding一般默認(rèn)是gbk,為中文編碼,但通常都是以u(píng)tf-8寫(xiě)入和讀取最好在打開(kāi)文件時(shí)指定編碼類型
打開(kāi)文件,沒(méi)有的話自動(dòng)創(chuàng)建一個(gè)文件
File1_Object = open('Text1.txt', 'w', encoding='utf-8') # 返會(huì)一個(gè)文件對(duì)象賦值給File1_Object
此時(shí)左邊工程欄會(huì)出現(xiàn)一個(gè)文件
2、寫(xiě)入
默認(rèn)形式寫(xiě)入
File1_Object = open('Text1.txt', 'w', encoding='utf-8') File1_Object.write('始知相憶深\n') # 往該對(duì)象里寫(xiě)入內(nèi)容 File1_Object.write('直道相思了無(wú)益,未妨惆悵是清狂\n') File1_Object.close() # 保存并關(guān)閉
此時(shí)打開(kāi)文件,會(huì)有以下內(nèi)容
以二進(jìn)制的形式打開(kāi)并寫(xiě)入
File2_Object = open('Text2.txt', 'wb') File2_Object.write('我喜歡的人要心若明鏡,眼若星辰,便是看盡人間丑惡,也依然心懷善良,優(yōu)雅從容!\n'.encode('utf-8')) # .encode('utf-8') str->bytes # 不加的話會(huì)報(bào)錯(cuò) TypeError: a bytes-like object is required, not 'str' File2_Object.close()
注意,以二進(jìn)制形式操作文件,不管是寫(xiě)入和讀取都不加encoding,否則會(huì)報(bào)錯(cuò)
如果加encoding='utf-8'的話,會(huì)有以下錯(cuò)誤顯示:
不加encoding的情況
# 后面不加encoding='utf-8',默認(rèn)為gbk File5_Object = open('Text3.txt', 'w') File5_Object.write('將頭發(fā)梳成大人摸樣\n') File5_Object.write('換上一身帥氣西裝\n') File5_Object.write('等回來(lái)見(jiàn)你一定比想象美\n') File5_Object.close()
此時(shí)打開(kāi)Text3會(huì)有以下顯示:
點(diǎn)擊箭頭指向位置,將會(huì)顯示出內(nèi)容:
3、追加
一般追加形式
File3_Object = open('Text1.txt', 'a', encoding='utf-8') File3_Object.write('我喜歡的人要心若明鏡,眼若星辰,便是看盡人間丑惡,也依然心懷善良,優(yōu)雅從容!\n') File3_Object.close()
此時(shí)Text1里面的內(nèi)容為:
對(duì)Text2進(jìn)行追加:
File2_Object = open('Text2.txt', mode='ab') File2_Object.write('處處相思苦!'.encode('utf-8')) File2_Object.close()
對(duì)Text3進(jìn)行追加
如果此時(shí)加了encoding=‘uft-8'
File5_Object = open('Text3.txt', 'a', encoding='utf-8') File5_Object.write('紗窗醉夢(mèng)中') File5_Object.close()
打開(kāi)文件Text3
仍會(huì)顯示異常,此時(shí)需點(diǎn)擊箭頭指向位置,會(huì)顯示:
點(diǎn)擊utf-8的話會(huì)顯示:
所以當(dāng)文件第一次打開(kāi)寫(xiě)入時(shí)沒(méi)有加encoding時(shí),后續(xù)進(jìn)行操作也不要加,不然會(huì)有亂碼,加了encoding的話,編碼格式后續(xù)也不要改變。
此時(shí)刪掉encoding=‘utf-8',文件內(nèi)容為正常
File5_Object = open('Text3.txt', 'a') File5_Object.write('紗窗醉夢(mèng)中') File5_Object.close()
4、讀文件
read(),將文件的內(nèi)容全部讀取出來(lái)。
File4_Object = open('Text1.txt', 'r', encoding='utf-8') print(File4_Object.read()) File4_Object.close()
read(num),傳入一個(gè)參數(shù),表示讀取指定字符個(gè)數(shù)
File4_Object = open('Text1.txt', 'r', encoding='utf-8') print(File4_Object.read(4)) # 只讀取前四個(gè)字符 print(File4_Object.read()) # 第二次讀取將從上一次讀取的位置繼續(xù)讀取 File4_Object.close() print()
readline() 一次性讀一行
File4_Object = open('Text3.txt', 'r') print(File4_Object.readline()) print(File4_Object.readline()) # 第二次讀取將從第二行開(kāi)始 print(File4_Object.readline()) File4_Object.close()
readlines() 按行讀取,一次性讀取所有內(nèi)容,返回一個(gè)列表,每一行內(nèi)容作為一個(gè)元素
File5_Object = open('Text3.txt', mode='r') print(File5_Object.readlines()) File5_Object.close()
以二進(jìn)制形式讀文件
File5_Object = open('Text2.txt', 'rb') content = File5_Object.read() print(content.decode('utf-8')) # decode解碼 # 由于原來(lái)Text2文件時(shí)以二進(jìn)制形式打開(kāi)并寫(xiě)入的,此時(shí)解碼就直接用utf-8,不能用gbk File5_Object.close() File5_Object = open('Text3.txt', 'rb') content = File5_Object.readline() # 只讀取一行 print(content.decode('gbk')) # 而Text3第一次創(chuàng)建并寫(xiě)入時(shí)是以默認(rèn)gbk的形式寫(xiě)入的,此時(shí)只能用gbk解碼 File5_Object.close()
with上下文管理對(duì)象,可以自動(dòng)釋放打開(kāi)的對(duì)象,防止忘記close()操作
with open('Text2.txt', 'r', encoding='utf-8')as File5_Object: print(File5_Object.read())
5、文件拷貝
小文件
def Copy_File(): # 接收用戶輸入的文件名 Original_File = input('請(qǐng)輸入要備份的文件名:') New_File_Name = Original_File.split('.') #分割接收到的文件名 New_File = New_File_Name[0] + '_copy.' + New_File_Name[1] Original_File_Object = open(Original_File, mode='r', encoding='utf-8') # 以只讀的模式打開(kāi)之前的文件 New_File_Object = open(New_File, mode='w', encoding='utf-8') # 以寫(xiě)入的方式打開(kāi)新備份的文件 New_File_Object.write(Original_File_Object.read()) Original_File_Object.close() New_File_Object.close() pass Copy_File() New_File = open('Text_copy.txt', mode='r', encoding='utf-8') print(New_File.readlines()) New_File.close()
大文件
def Copy_Big_File(): # 接收用戶輸入的文件名 Original_File = input('請(qǐng)輸入要備份的文件名:') New_File_Name = Original_File.split('.') #分割接收到的文件名 New_File = New_File_Name[0] + '_copy.' + New_File_Name[1] try: with open(Original_File, mode='r', encoding='utf-8')as Original_File_Object, open(New_File, mode='r', encoding='utf-8')as New_File_Object: while True: connect = Original_File_Object.read(1024) New_File_Object.read(connect) if len(connect) < 1024: break pass pass pass pass except Exception as msg: print(msg) pass pass Copy_Big_File()
6、tell()
文件定位,指的是當(dāng)前文件指針讀取到的位置,光標(biāo)位置。在讀寫(xiě)文件的過(guò)程中,如果想知道當(dāng)前的位置,可以使用tell()來(lái)獲取
File_Object = open('Text1.txt', mode='r', encoding='utf-8') print(File_Object.read(2)) print(File_Object.tell()) print(File_Object.read(5)) print(File_Object.tell()) File_Object.close() # utf-8編碼格式中每個(gè)漢字占3個(gè)字節(jié) print()
注解:先讀取兩個(gè)漢字,print輸出 “始知”,此時(shí)光標(biāo)位置為6說(shuō)明utf-8編碼格式中每個(gè)漢字占3個(gè)字節(jié),之后再讀取5個(gè),而只顯示了相憶深并換行打印了直,是因?yàn)檫€有一個(gè)換行符,此時(shí)光標(biāo)定位到20,又能說(shuō)明轉(zhuǎn)義符在utf-8編碼格式中占2個(gè)字節(jié)。
7、truncate(size)
可以對(duì)源文件進(jìn)行截取操作,截取size字節(jié)大小數(shù)據(jù),截取之后源文件將被修改,里面只剩下截取的數(shù)據(jù)
File_Object = open('Text1.txt', mode='r', encoding='utf-8') print('截取之前文件里的內(nèi)容:') print(File_Object.read()) File_Object.close() File_Object = open('Text1.txt', mode='r+', encoding='utf-8') # r+ 打開(kāi)一個(gè)文件用于讀寫(xiě)。文件指針將會(huì)放在文件的開(kāi)頭。 print()
File_Object.truncate(12) # 執(zhí)行完此行代碼后源文件會(huì)被修改 print(File_Object.tell()) print('截取之后文件里的內(nèi)容:') print(File_Object.read()) print(File_Object.tell()) File_Object.close() print()
光標(biāo)第一次位置指向開(kāi)頭(r+),截取之后(12個(gè)字節(jié)),指向文件末尾12
- 截取之前Text1為以下內(nèi)容
- 截取后為
8、seek()
在操作文件的過(guò)程,可定位到其他位置進(jìn)行操作 seek(offset,from)有2個(gè)參數(shù),offset指偏移字節(jié)量,負(fù)數(shù)是往前偏移,正數(shù)是往后偏移。from位置,0表示文件開(kāi)頭,1表示當(dāng)前位置,2表示文件末尾
File_Object = open('Text1.txt', mode='rb') print(File_Object.read(15).decode('utf-8')) print(File_Object.tell()) File_Object.seek(-6, 1) print(File_Object.tell()) print(File_Object.read(6).decode('utf-8')) File_Object.close() ''' 使用seek()函數(shù)時(shí),有時(shí)候會(huì)報(bào)錯(cuò)為 “io.UnsupportedOperation: can't do nonzero cur-relative seeks” 照理說(shuō),按照seek()方法的格式file.seek(offset,whence),后面的1代表從當(dāng)前位置開(kāi)始算起進(jìn)行偏移,那又為什么報(bào)錯(cuò)呢? 這是因?yàn)?,在文本文件中,沒(méi)有使用b模式選項(xiàng)打開(kāi)的文件,只允許從文件頭開(kāi)始計(jì)算相對(duì)位置,從文件尾計(jì)算時(shí)就會(huì)引發(fā)異常。 將 f=open("aaa.txt","r+") 改成 f = open("aaa.txt","rb") 就可以了 '''
對(duì)于文件操作更系統(tǒng)實(shí)戰(zhàn)的操作,讀者可參考
http://www.dbjr.com.cn/article/149035.htm
讀者可根據(jù)里面的流程分析對(duì)基礎(chǔ)進(jìn)行鞏固。
到此這篇關(guān)于python基礎(chǔ)之文件操作的文章就介紹到這了,更多相關(guān)python文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django基于客戶端下載文件實(shí)現(xiàn)方法
這篇文章主要介紹了Django基于客戶端下載文件實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04深入講解Python中面向?qū)ο缶幊痰南嚓P(guān)知識(shí)
這篇文章主要介紹了深入講解Python中面向?qū)ο缶幊痰南嚓P(guān)知識(shí),是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python中的模式匹配庫(kù)Pampy使用實(shí)例解析
這篇文章主要為大家介紹了Python中的模式匹配庫(kù)Pampy使用實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)pygame版的飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02python創(chuàng)建學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python創(chuàng)建學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11python 創(chuàng)建一維的0向量實(shí)例
今天小編就為大家分享一篇python 創(chuàng)建一維的0向量實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python自動(dòng)錄入ERP系統(tǒng)數(shù)據(jù)
這篇文章主要介紹了Python如何自動(dòng)錄入ERP系統(tǒng)數(shù)據(jù),用Python解決Excel問(wèn)題的最佳方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀2023-04-04