主要功能在copyFiles()函數里實現,如下:
代碼如下:
def copyFiles(src, dst):
srcFiles = os.listdir(src)
dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))
filesCopiedNum = 0
# 對源文件夾中的每個文件若不存在于目的文件夾則復制
for file in srcFiles:
src_path = os.path.join(src, file)
dst_path = os.path.join(dst, file)
# 若源路徑為文件夾,若存在于目標文件夾,則遞歸調用本函數;否則先創建再遞歸。
if os.path.isdir(src_path):
if not os.path.isdir(dst_path):
os.makedirs(dst_path)
filesCopiedNum += copyFiles(src_path, dst_path)
# 若源路徑為文件,不重復則復制,否則無操作。
elif os.path.isfile(src_path):
if not dstFiles.has_key(file):
shutil.copyfile(src_path, dst_path)
filesCopiedNum += 1
return filesCopiedNum
這里我首先使用os.listdir()函數來遍歷源文件夾src和目標文件夾dst,得到兩個文件列表,但由于我需要判重操作,因此需要在dst文件列表中進行查詢操作。由于列表的查詢效率不高,而字典是一個哈希表,查詢效率較高,因此我將目標文件列表轉換成一個只有鍵沒有值的字典:
代碼如下:
dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))
然后我遍歷源文件列表,若該路徑是一個文件夾,先判斷該文件夾在目標路徑中是否存在,若不存在,則先創建一個新路徑。然后遞歸調用本函數。其實不存在的時候更高效的方法是調用shutil.copytree()函數,但由于此處需要計算拷貝的文件數量,因此就沒有調用該函數。
若該路徑是一個文件,則首先判斷該文件在目標文件夾中是否存在。若不存在,則拷貝。
由于寫這個腳本主要是為了同步手機相冊到PC,因此只簡單地判斷一下文件名。若要判斷不同名但相同的文件,則可以繼續判斷一下md5值,這里就不再贅述。
完整代碼如下:
代碼如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
新聞熱點
疑難解答