Als ich kürzlich Fotos auf meinem Telefon gesichert habe, fand ich es etwas mühsam, dies manuell zu tun, also wollte ich ein Skript schreiben, um es automatisch zu machen. Da einige Fotos zuvor gesichert wurden, ist eine Duplikatbeurteilung erforderlich.
Die Hauptfunktion ist in der Funktion copyFiles() wie folgt implementiert:
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
Hier verwende ich zunächst die Funktion os.listdir(), um den Quellordner src und das Ziel zu durchlaufen Ordner dst und get Es gibt zwei Dateilisten, aber da ich umfangreiche Vorgänge ausführen muss, muss ich Abfragevorgänge in der dst-Dateiliste ausführen. Da die Abfrageeffizienz der Liste nicht hoch ist und das Wörterbuch eine Hash-Tabelle ist, ist die Abfrageeffizienz hoch, daher habe ich die Zieldateiliste in ein Wörterbuch nur mit Schlüsseln und ohne Werte konvertiert:
dstFiles = dict(map(lambda x:[x, ''], os.listdir(dst)))
Dann durchlaufe ich die Quelldateiliste. Wenn der Pfad ein Ordner ist, stellen Sie zunächst fest, ob der Ordner vorhanden ist Der Zielpfad ist nicht vorhanden. Erstellen Sie zunächst einen neuen Pfad. Rufen Sie diese Funktion dann rekursiv auf. Wenn sie nicht vorhanden ist, ist es tatsächlich eine effizientere Methode, die Funktion „shutil.copytree()“ aufzurufen. Da hier jedoch die Anzahl der kopierten Dateien berechnet werden muss, wird diese Funktion nicht aufgerufen.
Wenn es sich beim Pfad um eine Datei handelt, ermitteln Sie zunächst, ob die Datei im Zielordner vorhanden ist. Wenn es nicht existiert, kopieren Sie es.
Da dieses Skript hauptsächlich zum Synchronisieren des mobilen Fotoalbums mit dem PC geschrieben wurde, bestimmt es nur kurz den Dateinamen. Wenn Sie Dateien mit unterschiedlichen, aber gleichen Namen beurteilen möchten, können Sie weiterhin den MD5-Wert beurteilen, der hier nicht beschrieben wird.
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 输入两个文件夹a和b路径,将a中的文件拷进b,并计算拷贝的文件数。重复的不作处理。 # pythontab.com 2013-07-19 import os import shutil 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 def test(): src_dir = os.path.abspath(raw_input('Please enter the source path: ')) if not os.path.isdir(src_dir): print 'Error: source folder does not exist!' return 0 dst_dir = os.path.abspath(raw_input('Please enter the destination path: ')) if os.path.isdir(dst_dir): num = copyFiles(src_dir, dst_dir) else: print 'Destination folder does not exist, a new one will be created.' os.makedirs(dst_dir) num = copyFiles(src_dir, dst_dir) print 'Copy complete:', num, 'files copied.' if __name__ == '__main__': test()