Python 備份檔案,以及備份大檔案
阿新 • • 發佈:2019-02-14
今天分享一個很有用的小程式碼~
就是關於檔案的備份
import os #匯入os模組 ori_file_name = r'E:\PYTHON\mayday.mp3' #輸入檔案路徑 if os.path.isfile(ori_file_name): #判斷該路徑的是否是檔案 #擷取檔名,重組檔名 seek_num = ori_file_name.rfind('.') new_file_name =ori_file_name[:seek_num]+'_copy'+ori_file_name[seek_num:] #開啟原始檔 old_file = open(ori_file_name,'rb') #讀取檔案資訊 old_file_content = old_file.read() #建立新檔案 new_file = open(new_file_name,'wb') #將原始檔案資訊寫入 new_file.write(old_file_content) #關閉檔案 old_file.close() new_file.close() else: print('沒有該檔案')
好,這個程式碼就滿足一般檔案的copy了,
但是,如果遇到大檔案,在讀取檔案資訊的時候記憶體扛不住得話應該怎麼辦
emmmmm.....那肯定再買一條64G的記憶體啊!!!!
開個玩笑。我們下面對程式碼進行改良,可達到省下一個記憶體條的錢的效果
import os # 匯入os模組 ori_file_name = r'D:\大檔案.rmvb' # 輸入檔案路徑 if os.path.isfile(ori_file_name): # 判斷該路徑的是否是檔案 # 擷取檔名,重組檔名 seek_num = ori_file_name.rfind('.') new_file_name = ori_file_name[:seek_num] + '_copy' + ori_file_name[seek_num:] # 開啟原始檔 old_file = open(ori_file_name, 'rb') # 建立新檔案 new_file = open(new_file_name, 'ab') # 讀取檔案資訊,這部會在後面解釋 # for i in old_file: # if not i: # break new_file.write(i) new_file.write(old_file.read()) # 關閉檔案 old_file.close() new_file.close() else: print('沒有該檔案')
關於那個for迴圈,
最早的時候,我想的是用 for i in old_file.readlines(),後來發現,依然崩潰了,因為在使用readlines讀取檔案時,系統會吧該檔案整個檔案轉換成一個列表,而這個列表會佔用記憶體,所以雖然能剩去寫入時的記憶體,但是依然會浪費大部分資源。
後來我試試瞭如下程式碼: print(isinstance(old_file,Iterable)) ==>True 即old_file是可以迭代的,那麼,old_file的物件是原始檔,且這裡沒有對他在進行分解,所以在迭代old_file的時候不會佔用空間,所以這樣就只會在寫入時候佔用記憶體了以達到拷貝的效果。
以上是本人的見解,不知道是否有不對的地方,還希望有看到的大神幫忙指出~~