Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Sicherungsdatei

Python-Sicherungsdatei

巴扎黑
巴扎黑Original
2016-12-09 09:48:491322Durchsuche

Aufgabe:

Sie möchten geänderte Dateien in einem bestimmten Verzeichnisbaum mehrmals sichern, um zu verhindern, dass eine bestimmte Änderung versehentlich Ihre Bearbeitungsergebnisse löscht. Führen Sie regelmäßig das folgende Python-Skript aus, um Dateien im angegebenen Verzeichnis zu sichern.

#-*- coding:utf-8 -*-
import sys,os,shutil,filecmp
MAXVERSIONS = 100
def backup(tree_top, bakdir_name="bakdir"):
for dir,subdirs,files in os.walk(tree_top):
#确保每个目录都有一个备份目录
backup_dir = os.path.join(dir,bakdir_name)
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
#停止对备份目录的递归
subdirs[:] = [d for d in subdirs if d != bakdir_name]
for file in files:
filepath = os.path.join(dir,file)
destpath = os.path.join(backup_dir,file)
#检查以前的版本是否存在
for index in xrange(MAXVERSIONS):
backfile = '%s.%2.2d' % (destpath, index)
if not os.path.exists(backfile):
break
if index > 0:
old_backup = '%s.%2.2d' % (destpath,index-1)
abspath = os.path.abspath(filepath)
try:
if os.path.isfile(old_backup) and filecmp.cmp(abspath, old_backup,shallow=False):
continue
except OSError:
pass
try:
shutil.copy(filepath,backfile)
except OSError:
pass
if __name__ == '__main__':
try:
tree_top = sys.argv[1]
except IndexError:
tree_top = '.'
backup(tree_top)

Wenn Sie Dateien mit einem bestimmten Suffix sichern möchten (oder Dateien mit Ausnahme einer bestimmten Erweiterung sichern möchten); fügen Sie einen entsprechenden Test in der Datei-in-Dateien-Schleife hinzu:

for file in files:
    name,ext = os.path.splitext(file)
    if ext not in ('.py','.txt','.doc'):
        continue

Achten Sie auf den folgenden Code, um zu vermeiden, dass os.walk in das zu sichernde Unterverzeichnis rekursiert. Wenn die os.walk-Iteration beginnt, iteriert os.walk Unterverzeichnisse basierend auf Unterverzeichnissen. Dieses Detail zu os.walk ist auch ein hervorragendes Beispiel für die Verwendung von Generatoren und zeigt, wie Generatoren Informationen aus iterativem Code erhalten und wie sie sich wiederum auf die Iteration auswirken.

subdirs[:] = [d for d in subdirs if d != bakdir_name]


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn