文件操作實例
1.文件操作之bytes模式
1.除了上篇所介紹的‘r‘,‘w‘,‘a‘只讀只寫只追加模式外,大家可能意識到一個問題就是這種操作只能對純文本的文件進行操作,然而現在很多文件都是帶有圖片或者音頻視頻的文件,那該如何操作執行文件呢?接下來介紹文件操作其他三種類似模式
我們上面的‘r‘,‘w‘,‘a‘起始都是‘rt‘,‘wt‘,‘at‘即文本文件操作的只讀只寫只追加,要想操作文本文件以外的文件類型,那就需要在這個t的位置上做一些手腳了,對於非文本文件,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
當使用‘b‘模式時候需要註意點幾點是,b不能單獨使用,也就是說它大打開模式必須是‘rb‘,‘wb‘,‘ab‘這種分別表示字節類型的只讀,只寫,只追加,且三者保留了文本文件操作時的特性,即‘rb‘只能讀,且當文件不存在時會報錯,‘wb‘只寫,當文件不存在時會自動創建,而當文件存在時則會先清空文件內所有的內容再進行寫入操作,‘ab‘模式也是一樣,文件不存在時自動創建,存在時只在末尾追加內容
值得註意的時,用帶b模式去操作文件時,不需要指定編碼(因為編碼只會出現在於需要將數據進行編碼之後才能被人或計算機讀取的情況下)而字節類型的操作可以把它看作操作就跟二進制一樣,也就是說他的結果計算機能直接看懂不需要進行編碼,所以帶b模式不需要指定encoding=‘...‘ 說明。還有一點需要註意的是用帶b模式進行操作時都是站在二進制的層面上進行操作的,也就是你都出來的內容是二進制形式,那麽你寫如的內容也應該是以二進制的方式寫入的(需要用到decode)。
2.bytes類型的用途
1.數據存取到計算機硬件中
2.基於網絡的信息之間傳輸
2.文件操作實例講解
1.涉及到文件,肯定會有文件的修改,拷貝等日常計算機使用中使用次數最頻繁的操作
練習1,利用b模式,編寫一個cp工具,要求如下:
1. 既可以拷貝文本又可以拷貝視頻,圖片等文件
2. 用戶一旦參數錯誤,打印命令的正確使用方法,如usage: cp source_file target_file
提示:可以用import sys,然後用sys.argv獲取腳本後面跟的參數
import sys l = sys.argv if len(l)!=3: print(‘usage: cp source_file target_file‘) sys.exit() source_file,target_file=sys.argv[1],sys.argv[2] with open(source_file,‘rb‘) as read_f,open(target_file,‘wb‘) as write_f: for line in read_f: write_f.write(line)
文件的數據是存放於硬盤上的,因而只存在覆蓋、不存在修改這麽一說,我們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:
方式一:將硬盤存放的該文件的內容全部加載到內存,在內存中是可以修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)
with open(‘old.txt‘,‘r‘,encoding=‘utf-8‘) as f1: f1.read().replace(‘老的內容‘,‘新的內容‘) with open(‘old.txt‘,‘w‘,encoding=‘utf-8‘) as f2: f2.write(f1.read().replace(‘老的內容‘,‘新的內容‘))
方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最後用新文件覆蓋源文件
import os #os為一個模塊 with open(‘old.txt‘,‘r‘,encoding=‘utf-8‘) as f1,open(‘new.txt‘,‘w‘,encoding=‘utf-8‘) as f2: #這裏有個小技巧,當需要同時打開好幾個文件時,可以在
#一個with內進行操作,如果太長影響畫面效果可以在每個f1,後面加\如何按enter可以換行操作,本質還是一行 for line in f1: if ‘需要修改的內容‘ in f1: line=line.replace(‘舊的內容‘,‘新的內容‘) f2.write(line) os.remove(‘old.txt‘) os.rename(‘new.txt‘,‘ole.txt‘)#將老的文件刪除再將新的文件命名為來的文件名
1. 文件a.txt內容:每一行內容分別為商品名字,價錢,個數,求出本次購物花費的總錢數 apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 sum = 0 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: for line in f: l = line.split(‘ ‘) sum +=int(l[2]) print(sum)
小知識補充:我們現在知道了計算機裏面的硬盤裏面的數據根本沒有刪除和修改這麽一說,所謂的刪除其實是計算機將你刪除了的那一部分存取數據的空間標記為free狀態,嚴格意義上那片區域的數據還在,但是一旦有其他數據需要存到硬盤時,就會隨機儲存到free區域,所以文件修復不是百分百的,只有一種情況就是你刪除了一些數據後就把電腦關機(那麽被你刪除的數據起始一直還在硬盤中),一旦你開機進行一些存取操作,那就保不住之前的數據什麽時候會被覆蓋了,那修改文件呢則是先將文件所以內容讀到內存如何修改再全部儲存到文件區域對原理的區域進行覆蓋
# 1.拷貝文件 # import sys #倒入sys模塊 # l = sys.argv #把命令行中解釋器後空格分割的所有參數都存成列表 # src_file=l[1] #源文件路徑 # des_file=l[2] #要copy到所在目錄路徑 # with open(r‘%s‘%src_file,‘rb‘) as f,# open(r‘%s‘%des_file,‘wb‘) as f1: # #這裏用字符串格式化是為了解決windows路徑\轉義符的問題 # for line in src_file: # des_file.write(line)拷貝文件知識
文件操作實例