1. 程式人生 > >Python 備份檔案,以及備份大檔案

Python 備份檔案,以及備份大檔案

今天分享一個很有用的小程式碼~

就是關於檔案的備份

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的時候不會佔用空間,所以這樣就只會在寫入時候佔用記憶體了以達到拷貝的效果。

以上是本人的見解,不知道是否有不對的地方,還希望有看到的大神幫忙指出~~