将文件与 zip 列表进行比较并确定它是否更大
Compare files with a zip list and figure out if it is larger
我想比较两个压缩文件夹的文件。
仅当幅度更大时才复制当缺少相同名称时末尾已经有一个 zip 时,复制文件。
仅比较名称而不是日期:es--> Campobasso[CB]-Molise
文件夹 DirTemp 邮编:
坎波巴索[CB]-Molise__02-02-2016.zip
文件夹 DirArc ZIP:
福贾[FG]-Puglia__22-01-2016.zip
罗马[RM]-Lazio__20-01-2016.zip
文件夹 DirArcScartati,
它们是 zip,如果找到并且较小,则放在另一个文件夹中
这是我的代码,但部分工作,我无法复制控件末尾的文件(如果不存在),带列表。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os,glob,shutil
DirTemp = "/var/www/vhosts/anon_ftp/incoming/"
DirArc = "/var/www/vhosts/settings/BackupDTT/"
DirArcScartati = "/var/www/vhosts/settings/BackupDTT_scartati/"
ExtFile = ".zip"
def ControlFile():
# Controllo i nuovi file zip
listnew=[]
#print "Avvio copia"
for name in glob.glob(DirTemp + "*" + ExtFile):
listnew.append((name.replace(DirTemp,"").replace(ExtFile,"").split("__")[0],name))
#print "Nome: "+ str(listnew)
for oldname in glob.glob(DirArc + "*" + ExtFile):
#print "Setting Esistente: "+oldname
namesplit = oldname.replace(DirArc,"").replace(ExtFile,"").split("__")[0]
for newname in listnew:
#print "New Nome: "+str(newname[0])
print namesplit
if namesplit == newname[0]:
if os.path.getsize(newname[1]) >= os.path.getsize(oldname):
print ("trasferire file" + newname[1] + " >>> " + oldname)
shutil.copy2(newname[1],DirArc)
os.remove(oldname)
#os.remove(newname[1])
break
elif os.path.getsize(newname[1]) <= os.path.getsize(oldname):
print ("File più piccolo---\nFileNuovo: " + str(os.path.getsize(newname[1])) + " FileVecchio: " + str(os.path.getsize(oldname)))
shutil.copy2(newname[1],DirArcScartati)
#os.remove(newname[1])
break
else:
for newname in listnew:
print ("Nuova città trasferisco il file: " + newname[1])
shutil.copy2(newname[1],DirArc)
#os.remove(newname[1])
break
ControlFile()
以下方法可能更容易理解:
def get_file_dictionary(folder):
""" Return a dictionary of zip files in the given folder as tuples in the form: (basename, full path, size) """
return {os.path.splitext(os.path.split(x)[1])[0].split('__')[0] : (x, os.path.getsize(x)) for x in glob.glob(folder + '*.zip')}
DirTemp = "/var/www/vhosts/italysat.eu/anon_ftp/incoming/"
DirArc = "/var/www/vhosts/italysat.eu/settings.italysat.eu/BackupDTT/"
DirArcScartati = "/var/www/vhosts/italysat.eu/settings.italysat.eu/BackupDTT_scartati/"
incoming = get_file_dictionary(DirTemp)
existing = get_file_dictionary(DirArc)
for base_name_inc, (full_name_inc, size_inc) in incoming.items():
try:
full_name_exist, size_exist = existing[base_name_inc]
if size_inc > size_exist:
print "Transfer {} -> {}".format(full_name_inc, full_name_exist)
os.remove(full_name_exist)
shutil.copy2(full_name_inc, full_name_exist)
else:
discard = os.path.join(DirArcScartati, os.path.split(full_name_inc)[1])
print "Discard {} -> {}".format(full_name_inc, discard)
shutil.copy2(full_name_inc, discard)
except KeyError, e:
new_entry = os.path.join(DirArc, os.path.split(full_name_inc)[1])
print "Transfer new {} -> {}".format(full_name_inc, new_entry)
os.remove(full_name_inc)
它首先创建包含传入文件夹和存档文件夹中所有条目的字典。然后它遍历传入字典以查看存档中是否有条目。如果是,它会检查两个尺寸,如果不是,它会复制新条目。
字典以您的基本名称(无日期)为键,完整路径名和文件大小为值。
我想比较两个压缩文件夹的文件。 仅当幅度更大时才复制当缺少相同名称时末尾已经有一个 zip 时,复制文件。 仅比较名称而不是日期:es--> Campobasso[CB]-Molise
文件夹 DirTemp 邮编: 坎波巴索[CB]-Molise__02-02-2016.zip
文件夹 DirArc ZIP: 福贾[FG]-Puglia__22-01-2016.zip 罗马[RM]-Lazio__20-01-2016.zip
文件夹 DirArcScartati, 它们是 zip,如果找到并且较小,则放在另一个文件夹中
这是我的代码,但部分工作,我无法复制控件末尾的文件(如果不存在),带列表。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os,glob,shutil
DirTemp = "/var/www/vhosts/anon_ftp/incoming/"
DirArc = "/var/www/vhosts/settings/BackupDTT/"
DirArcScartati = "/var/www/vhosts/settings/BackupDTT_scartati/"
ExtFile = ".zip"
def ControlFile():
# Controllo i nuovi file zip
listnew=[]
#print "Avvio copia"
for name in glob.glob(DirTemp + "*" + ExtFile):
listnew.append((name.replace(DirTemp,"").replace(ExtFile,"").split("__")[0],name))
#print "Nome: "+ str(listnew)
for oldname in glob.glob(DirArc + "*" + ExtFile):
#print "Setting Esistente: "+oldname
namesplit = oldname.replace(DirArc,"").replace(ExtFile,"").split("__")[0]
for newname in listnew:
#print "New Nome: "+str(newname[0])
print namesplit
if namesplit == newname[0]:
if os.path.getsize(newname[1]) >= os.path.getsize(oldname):
print ("trasferire file" + newname[1] + " >>> " + oldname)
shutil.copy2(newname[1],DirArc)
os.remove(oldname)
#os.remove(newname[1])
break
elif os.path.getsize(newname[1]) <= os.path.getsize(oldname):
print ("File più piccolo---\nFileNuovo: " + str(os.path.getsize(newname[1])) + " FileVecchio: " + str(os.path.getsize(oldname)))
shutil.copy2(newname[1],DirArcScartati)
#os.remove(newname[1])
break
else:
for newname in listnew:
print ("Nuova città trasferisco il file: " + newname[1])
shutil.copy2(newname[1],DirArc)
#os.remove(newname[1])
break
ControlFile()
以下方法可能更容易理解:
def get_file_dictionary(folder):
""" Return a dictionary of zip files in the given folder as tuples in the form: (basename, full path, size) """
return {os.path.splitext(os.path.split(x)[1])[0].split('__')[0] : (x, os.path.getsize(x)) for x in glob.glob(folder + '*.zip')}
DirTemp = "/var/www/vhosts/italysat.eu/anon_ftp/incoming/"
DirArc = "/var/www/vhosts/italysat.eu/settings.italysat.eu/BackupDTT/"
DirArcScartati = "/var/www/vhosts/italysat.eu/settings.italysat.eu/BackupDTT_scartati/"
incoming = get_file_dictionary(DirTemp)
existing = get_file_dictionary(DirArc)
for base_name_inc, (full_name_inc, size_inc) in incoming.items():
try:
full_name_exist, size_exist = existing[base_name_inc]
if size_inc > size_exist:
print "Transfer {} -> {}".format(full_name_inc, full_name_exist)
os.remove(full_name_exist)
shutil.copy2(full_name_inc, full_name_exist)
else:
discard = os.path.join(DirArcScartati, os.path.split(full_name_inc)[1])
print "Discard {} -> {}".format(full_name_inc, discard)
shutil.copy2(full_name_inc, discard)
except KeyError, e:
new_entry = os.path.join(DirArc, os.path.split(full_name_inc)[1])
print "Transfer new {} -> {}".format(full_name_inc, new_entry)
os.remove(full_name_inc)
它首先创建包含传入文件夹和存档文件夹中所有条目的字典。然后它遍历传入字典以查看存档中是否有条目。如果是,它会检查两个尺寸,如果不是,它会复制新条目。
字典以您的基本名称(无日期)为键,完整路径名和文件大小为值。