目錄摘要python
文件處理windows
1.文件初識ide
2.文件的讀操做函數
3.文件的寫操做編碼
4.文件的追加操做spa
5.文件的其餘操做操作系統
6.文件的修改指針
正式開始code
文件處理:寫了這麼多代碼了,有的時候咱們執行完成的結果想永久保存或者是保存後方便下一次在調用,對於文件的主要操做就是讀,寫以及追加了。視頻
1.文件初識
如今咱們有一個文件,如今經過python代碼打開這個文件,而打開這個文件,就有了必須的三要素
path:文件的路徑
mode:操做類型,r w r+ w+ a……
encoding: 編碼類型 通常的unicode gbk gb2312等
通常讀取的時候報錯的緣由:
1.1 路徑錯誤:\與後面的那個字符具備了特殊意義。
解決辦法:
r’d:\test文件.txt’在路徑最前方加r,代表這個是一個完整的路徑
‘d:\\test文件.txt’對第一個\進行轉義,代表他是一個\
1.2 unicodedecodeerror:編碼錯誤
打開文件的編碼與文件的編碼不一致
1.3 encoding只是聲明瞭這個文件須要用什麼編碼編譯
1.4 路徑
絕對路徑:從磁盤根目錄開始,找到文件的具體路徑。
相對路徑:從當前路徑(當前文件夾)找到的文件的路徑
2.文件的讀操做
2.1 文件讀操做的定義與基本解釋,具體查看下方示例
示例一:
f = open(file='D:\pycharm\全棧三期\day6\做業.txt',mode='r',encoding='utf-8') data = f.read() f.close() #上述就是一個文件讀取最完整的表述
f f1 file file_handle f_h等,都稱之爲文件句柄
open() python的內置函數,可是其實是調用的操做系統對文件操做的功能#windows默認是GBK編碼,Linux與MACos 默認使用utf-8編碼
####對文件的任何操做都是藉助文件句柄進行操做####
file= '文件的絕對路徑' mode ='對於文件的操做模式' encoding = '文件的編碼格式',此處的encoding必須和文件寫入時的文件編碼格式一致,要否則就會報錯 #而後將讀取的文件的內容賦值給一個變量 #!!!!# 很重要的是對於一個文件操做後必定要對文件關閉,必定要關閉文件句柄
2.2 ’r‘的五種讀取方式
2.2.1 r.read()所有讀出來
f1 = open('做業.txt','r',encoding='utf-8') data = f1.read() print(data)
f1.close() #結果 咱們的做業啊~~~~~! 咱們的做業還有不少!!! #所有讀取出來
2.2.2 r.read(n)讀幾個字符
f1 = open('做業.txt','r',encoding='utf-8') data = f1.read(3) print(data)
f1.close() #結果 咱們的 #咱們會發現輸入3並非讀取三個字節,而是三個字符
2.2.3 r.readline()讀一行
f1 = open('做業.txt','r',encoding='utf-8') print(f1.readline()) print(f1.readline())
f1.close() #結果 咱們的做業啊~~~~~! 咱們的做業還有不少!!! #這樣就是一行一行讀取,不過一行只能讀取一次
2.2.4 r.readlines()所有讀取,返回一個列表
f1 = open('做業.txt','r',encoding='utf-8') data = f1.readlines() print(data)
f1.close() #結果 ['咱們的做業啊~~~~~!\n', '咱們的做業還有不少!!!'] #會發現生成的文件句柄是一個列表,而後循環這個文件,就會逐行打印
2.2.5 for循環的讀取
f1 = open('做業.txt','r',encoding='utf-8') for line in f1: print(line)
f1.close() #結果 咱們的做業啊~~~~~! 咱們的做業還有不少!!!
總結:文件讀取有以上五種狀況,不過對於前四種,若是文件比較小,則使用前四種一點問題都沒有,但是若是是一個大文件讀取,一次性讀取一個大容量文件,內存絕對會撐爆,對於這種文件操做,通常是將文件生成一個迭代器,一行一行的去讀取,這樣內存佔用就會小不少了。
2.3 rb模式
對於rb,咱們須要知道一點,b模式操做的文件是非文字類的文件:圖片,音頻,視頻等
f = open('做業.txt','rb') data = f.read() print(data) #結果 b'\xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84\xe4\xbd\x9c\xe4\xb8\x9a\xe5\x95\x8a~~~~~\xef\xbc\x81\r\n\xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84\xe4\xbd\x9c\xe4\xb8\x9a\xe8\xbf\x98\xe6\x9c\x89\xe5\xbe\x88\xe5\xa4\x9a\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81' #生成的結果就是上面這麼一串字符串
f = open('做業.txt','rb')
data = f.read(3)
print(data)
f.close()
#結果
b'\xe6\x88\x91'
由上面這個示例,能夠看出,
在r模式下,read(n)是按照字符來移動
在rb模式下,read(n)就是按照字節來移動,並非字符了
rb的格式是以二進制的方式的讀取文件,文件在硬盤中存儲方式爲010101010,則rb就是將文件安裝二進制的方式讀取出來,若是須要轉換在使用encoding進行編碼
2.4 r+讀寫模式
對於讀寫模式,咱們能夠理解爲先讀後寫,在追加
f1 = open('做業.txt','r+',encoding='utf-8') data = f1.read() f1.write('今天還要加油鴨!') print(data) f1.close()
結果爲
若是咱們非要先寫後讀呢,看示例
f1 = open('做業.txt','r+',encoding='utf-8') f1.write('今天還要加油鴨!') data = f1.read() print(data) f1.close()
結果呢就變成下面這個樣子
和上面的相比,咱們寫的內容就會覆蓋文件中第一行,並無起到追加的效果,這個時候就須要一個提到一個指針的概念,這個在後面文件的其餘應用中說明。須要謹記的是在r+模式中,應該先讀在寫的
3.文件的寫操做
3.1 w操做
這個時候你必定要記得,w就是就將文件從新寫一遍,之前的內容所有都沒有了!!!!
文件的寫操做,是沒有文件則建立文件,有文件則會先清空內容在寫入新內容
w模式下,必須是以字符串的內容寫入,不過須要記住的是文件的寫操做是能夠持續寫的
#第一種
f = open(file='做業.txt',mode='w',encoding='utf-8') f.write('咱們的做業啊~~~~~!') f.close() #file= '文件打開的相對路徑' #mode = '打開的文件方式爲寫' #encoding ='編碼格式'
#第二種
f1 = open('做業.txt','w',encoding='utf-8')
f1.write('我愛寫做業')
f1.write('我愛寫做業')
f1.write('我愛寫做業')
f1.write('我愛寫做業')
f1.write('我愛寫做業')
f1.write('苦笑!')
f1.close()
運行結果就是這樣子,之前的內容所有都沒有了,慎重使用
注意:
文件操做時,以 「w」或「wb」 模式打開,則只能寫,而且在打開的同時會先將內容清空。
寫入到硬盤上時,必須是某種編碼的0101010,打開時須要注意:
wb,寫入時須要直接傳入以某種編碼的0100101,即:字節類型
w 和 encoding,寫入時須要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換爲該編碼的 010101010
3.2 wb操做
rb和wb通常都是用在非文本的文件中,例如圖片,音頻和視頻等
f = open('百度.jpg','rb') coment = f.read() f.close() f1 = open('百度1.jpg','wb') f1.write(coment) f1.close() #結果會看到在相同文件中看到同樣的圖片
3.3 w+操做
w+操做就是寫讀模式
f1 = open('做業.txt','w+',encoding='utf-8') f1.write('啊啊啊啊啊啊啊~~~') f1.write('啊啊啊啊啊啊啊~~~') f1.write('啊啊啊啊啊啊啊~~~') f1.write('啊啊啊啊啊啊啊~~~') f1.seek(0) print(f1.read()) #結果 啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~啊啊啊啊啊啊啊~~~ #就會發現,會先將以前的文件所有清空,清空後再賦值,而後將光標放在第一位,才能讀取出來,這個通常真的不用
4.文件的追加操做
輸出結果
f = open(file='做業.txt',mode='a',encoding='utf-8') f.write('\n咱們的做業還有不少!!!') f.close() #文件的追加,就是在文件的最後一行追加一行,並不改變文件自己的內容
用追加模式,沒有文件則建立文件追加內容,有文件的則會在文件的末尾追加內容
注意:
文件操做時,以 「a」或「ab」 模式打開,則只能追加,即:在原來內容的尾部追加內容
寫入到硬盤上時,必須是某種編碼的0101010,打開時須要注意:
ab,寫入時須要直接傳入以某種編碼的0100101,即:字節類型
a 和 encoding,寫入時須要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換爲該編碼的 010101010
5.文件的其餘操做
readable writeable 判斷一個句柄是否可讀,可寫
f = open('做業.txt','w',encoding='utf-8') print(f.readable()) print(f.writable()) #結果 False True #返回的是布爾值
seek tell 將光標移動到一個特定的位置 判斷一個文件如今光標的位置
f = open('做業.txt','r+',encoding='utf-8') print(f.read()) f.seek(3)#指針遷移是按照字節遷移,由於用utf-8編碼,因此一個字符就是三個字節 print(f.read()) f.seek(0,2)#將指針末尾 print(f.tell()) f.close() #結果 涼州詞 黃河遠山白雲間 一片孤城萬仞山 羌笛何必怨楊柳 春風不度玉門關 州詞 黃河遠山白雲間 一片孤城萬仞山 羌笛何必怨楊柳 春風不度玉門關 101#光標位置
flush 將內存中的內容強制刷新到磁盤內
f2 = open('file4',encoding='utf-8',mode='w') f2.write('老男孩教育是最好的學校') f2.flush() # 強制保存 至關於ctrl + s f2.close()
trunkcate 在可寫的模式下,截取原文件,只能從頭截取,不能調整光標去截取一部分
# f2 = open('file4',encoding='utf-8',mode='w') # f2.write('老男孩教育是最好的學校') # f2.flush() # 強制保存 至關於ctrl + s # f2.close() # 不能在w模式下使用truncate # f1 = open('file4', encoding='utf-8',mode='w') # f1.truncate(6) # f1.close()
補充用法:若是不知道文件的編碼格式,也能夠,不過這個時候須要導入其餘模塊
f = open('做業.txt',mode='rb') data = f.read() f.close() result = chardet.detect(data) print(result) #結果 {'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''} #其中confidence:1.0 表示100%確定爲utf-8編碼的文件
#簡單的文本文檔逐行打印
f = open('做業.txt',mode='r',encoding='utf-8')
for line in f:
print(line)
6.文件的修改
6.1 文件打開的另外一種方式
除了上文中的打開方式以外,還有另一種方式,相比於上面的方式,有一些其餘的特色:
with open('做業.txt','r',encoding='utf-8')as f1, \ open('百度.jpg','rb',): for line in f1: print(line.strip()) #結果 涼州詞 黃河遠山白雲間 一片孤城萬仞山 羌笛何必怨楊柳 春風不度玉門關
雖然用with是能夠自動關閉文件句柄,若是持續將一個文件產生倆次文件句柄,頗有可能發生IO錯誤,仍是須要謹記的。
6.2 文件的修改
現有的文件編輯軟件,例如office,wps這些文本操做軟件他們對於文件編輯的操做方式以下
現有這麼案例,將文本中’alex‘所有改寫爲’SB’:
log內
alex是老男孩python發起人,建立人。
alex實際上是人妖。
誰說alex是sb?
大家真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。
方式一:
import os with open('log','r',encoding='utf-8')as f1,\ open('log.bak','w',encoding= 'utf-8')as f2: old_data = f1.read() new_data = old_data.replace('alex','SB') f2.write(new_data) os.remove('log') os.rename('log.bak','log') #結果 SB是老男孩python發起人,建立人。 SB實際上是人妖。 誰說SB是sb? 大家真逗,SB再牛逼,也掩飾不住資深屌絲的氣質。
方式二:升級一下,如今文件內容比較少,若是內容多了額,一下就撐爆內存了,改進下,用for循環的方式
import os with open('log','r',encoding='utf-8')as f1,\ open('log.bak','w',encoding='utf-8')as f2: for line in f1: line = line.replace('alex','SB') f2.write(line) os.remove('log') os.rename('log.bak','log') #結果 SB是老男孩python發起人,建立人。 SB實際上是人妖。 誰說SB是sb? 大家真逗,SB再牛逼,也掩飾不住資深屌絲的氣質。 對於大文件仍是推薦這麼用,不過對於小文件就無所謂了,反正也佔用不了太多內存
最後總結一下,對於文件操做是python中的一種基本操做,其中,主要用r r+ 其次用rb w wb a
帶b的模式都是操做非文本類的文件,例如圖片音頻和視頻
文件操做中比較經常使用的爲readable writable flush tell seek