有時候我們無法確認備份目錄與源目錄的檔案是否保持一致,包括源目錄中的新檔案或目錄,更新檔案或目錄有無成功同步,定期進行校驗,沒有成功則希望有針對性的進行補備份。本例項使用了filecmp模組的left_only,diff_files方法地櫃獲取源目錄的更新項,再通過shutil.copyfile、os.makedirs方法對更新項進行複製,最終保持一致狀態。具體原始碼如下,大家可以直接拷貝使用。
這裡,我的指令碼檔名稱為backup.py
# -*- coding:utf-8 -*-
'''本例項使用了filecmp模組的left_only,diff_files方法地櫃獲取源目錄的更新項,
再通過shutil.copyfile、os.makedirs方法對更新項進行複製,最終保持一致狀態。
同時,本程式實現了只對修改的檔案進行複製操作
created on 2023年1月4日
@author: liuyazhuang
'''import os, sys
import filecmp
import re
import shutil
holderlist =
#遞迴獲取更新項函式
def compareme(dir1, dir2):
dircomp = filecmp.dircmp(dir1, dir2)
#源目錄新檔案或目錄
only_in_one = dircomp.left_only
#不匹配檔案,源目錄檔案已發生變化
diff_in_one = dircomp.diff_files
#定義源目錄的絕對路徑
dirpath = os.path.abspath(dir1)
#將更新檔名或目錄追加到holderlist
#判斷是否存在相同子目錄,以便遞迴
if len(dircomp.common_dirs) > 0:
#遞迴子目錄
for item in dircomp.common_dirs:
compareme(os.path.abspath(os.path.join(dir1, item)), os.path.abspath(os.path.join(dir2, item)))
return holderlist
def main():
#要求輸入源目錄和備份目錄
if len(sys.argv) > 2:
dir1 = sys.argv[1]
dir2 = sys.argv[2]
else:
print "請輸入源目錄和備份目錄"
sys.exit()
#下面的**是測試**,測試完畢後注釋掉
#-------------測試目錄開始------------------
#dir1 = "d:/data/dir1"
#dir2 = "d:/data/dir2"
#-------------測試目錄結束------------------
#對比源目錄和備份目錄
source_files = compareme(dir1, dir2)
dir1 = os.path.abspath(dir1)
#備份目錄路徑加'/'
#if not dir2.endswith('/'): dir2 = dir2 + '/'
destination_files =
createdir_bool = false
#遍歷返回的差異檔案或者目錄清單
for item in source_files:
#將源目錄差異路徑清單對應替換成備份目錄
#destination_dir = re.sub(dir1, dir2, item)
destination_dir = item.replace(dir1, dir2)
#print destination_dir
#如果差異路徑為目錄並且不存在,則在備份目錄中建立
if os.path.isdir(item):
if not os.path.exists(destination_dir):
os.makedirs(destination_dir)
#再次呼叫compareme函式標記
createdir_bool = true
#重新呼叫compareme函式,重新遍歷新建立的目錄內容
if createdir_bool:
destination_files =
source_files =
#呼叫compareme函式
source_files = compareme(dir1, dir2)
#獲取源目錄差異路徑清單,對用替換成備份目錄
for item in source_files:
#destination_dir = re.sub(dir1, dir2, item)
destination_dir = item.replace(dir1, dir2)
print "update item:"
#輸出更新項列表清單
print source_files
#將源目錄與備份目錄檔案清單拆分成元祖
copy_pair = zip(source_files, destination_files)
for item in copy_pair:
#判斷是否為檔案,是則進行複製操作
if os.path.isfile(item[0]):
shutil.copyfile(item[0], item[1])
if __name__ == '__main__':
main()
執行此指令碼
python backup.py d:/data/dir1 d:/data/dir2
輸出結果為:
update item:
['d:\\data\\dir1\\catering_sale_all.xls', 'd:\\data\\dir1\\catering_dish_profit.xls', 'd:\\data\\dir1\\catering_sale.xls', 'd:\\data\\dir1\\catering_sale.csv', 'd:\\data\\dir1\\catering_fish_congee.xls', 'd:\\data\\dir1\\test', 'd:\\data\\dir1\\catering_sale_all.xls', 'd:\\data\\dir1\\catering_dish_profit.xls', 'd:\\data\\dir1\\catering_sale.xls', 'd:\\data\\dir1\\catering_sale.csv', 'd:\\data\\dir1\\catering_fish_congee.xls', 'd:\\data\\dir1\\test\\catering_sale.csv', 'd:\\data\\dir1\\test\\catering_dish_profit.xls', 'd:\\data\\dir1\\test\\catering_fish_congee.xls', 'd:\\data\\dir1\\test\\catering_sale_all.xls', 'd:\\data\\dir1\\test\\catering_sale.xls']
拷貝完畢,我在d:/data/dir1目錄下修改catering_dish_profit.xls檔案,再次執行
python backup.py d:/data/dir1 d:/data/dir2
輸出結果為:
update item:
['d:\\data\\dir1\\catering_dish_profit.xls']
Python使用filecmp校驗源目錄備份目錄
確認備份目錄與源目錄檔案是否保持一致,包括源目錄中的新檔案或目錄 刪除檔案或刪除目錄 更新檔案或目錄有無成功同步,定期校驗,保證源目錄和備份目錄的同步,對相同檔案不做任何改動,對更新檔案或目錄 新檔案或目錄進行拷貝更新,對源目錄刪除檔案或目錄在備份目錄中刪除 使用filecmp模組的left onl...
python3校驗源與備份目錄差異
有時候我們無法確認備份目錄與源目錄檔案是否保持一致,包括源目錄中的新檔案或目錄 更新檔案或目錄有無成功同步,定期進行校驗,沒有成功則希望有針對性地進行補備份。本示例使用了filecmp模組的left only diff files方法遞迴獲取源目錄的更新項,再通過shutil.copyfile os...
python之目錄操作
編寫乙個search s 的函式,能在當前目錄以及當前目錄的所有子目錄下查詢檔案名包含指定字串的檔案,並列印出完整路徑 usr bin env python import os,os.path defsearch path,s 獲取當前目錄下的所以檔案和資料夾 for x in os.listdir...