Python 将文件与zip列表进行比较,找出它是否更大

Python 将文件与zip列表进行比较,找出它是否更大,python,list,copy,Python,List,Copy,我想比较两个zip文件夹的文件。 仅当末尾已存在zip且缺少相等名称时,如果大小更大,则复制该文件。 仅比较名称而不是日期:es-->Campobasso[CB]-Molise 文件夹DirTemp ZIP: 坎波巴索[CB]-Molise__02-02-2016.zip 文件夹DirArc-ZIP: Foggia[FG]-Puglia__22-01-2016.zip 罗马[RM]-Lazio__20-01-2016.zip 文件夹dirarccartati, 它们是一个zip文件,如果找到了,

我想比较两个zip文件夹的文件。 仅当末尾已存在zip且缺少相等名称时,如果大小更大,则复制该文件。 仅比较名称而不是日期:es-->Campobasso[CB]-Molise

文件夹DirTemp ZIP: 坎波巴索[CB]-Molise__02-02-2016.zip

文件夹DirArc-ZIP: Foggia[FG]-Puglia__22-01-2016.zip 罗马[RM]-Lazio__20-01-2016.zip

文件夹dirarccartati, 它们是一个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()
#/usr/bin/env python
#-*-编码:UTF-8-*-
导入操作系统、glob、shutil
DirTemp=“/var/www/vhosts/anon_ftp/incoming/”
DirArc=“/var/www/vhosts/settings/BackupDTT/”
dirarccartati=“/var/www/vhosts/settings/BackupDTT_scarati/”
ExtFile=“.zip”
def ControlFile():
#Controllo i nuovi文件压缩包
listnew=[]
#打印“Avvio copia”
对于glob.glob(DirTemp+“*”+ExtFile)中的名称:
listnew.append((name.replace(DirTemp,“”).replace(ExtFile,“”).split(“\uuu”)[0],name))
#打印“Nome:+str(列表新建)
对于glob.glob(DirArc+“*”+ExtFile)中的oldname:
#打印“设置Esistente:+oldname”
namesplit=oldname.replace(DirArc,“”).replace(ExtFile,“”).split(“\”)[0]
对于listnew中的newname:
#打印“新名称:”+str(新名称[0])
打印名称分裂
如果namesplit==newname[0]:
如果os.path.getsize(newname[1])>=os.path.getsize(oldname):
打印(“传输文件”+新名称[1]+“>>>”+旧名称)
shutil.copy2(新名称[1],DirArc)
删除操作系统(旧名称)
#删除操作系统(新名称[1])
打破

elif os.path.getsize(newname[1])以下方法可能更容易遵循:

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)
它首先创建包含传入文件夹和存档文件夹中所有条目的字典。然后,它遍历传入的字典,查看归档中是否有条目。如果是,则检查两个尺寸,如果不是,则复制新条目


字典以键为基本名称(不带日期)存储,值为完整路径名和文件大小。

注意:您的
else
语句没有正确对齐,如果namesplit==newname[0],我猜它应该在
下:
如果我在复制后删除文件,将停止代码Nuova cittátrasferisco il文件:/var/www/vhosts/anon_ftp/incoming/Campobasso[CB]-Molise_uu02-02-2016.zip回溯(最后一次调用):文件“/copy.py”,第45行,在ControlFile()文件中。“copy.py”,第27行,在控制文件中,如果os.path.getsize(newname[1])>=os.path.getsize(oldname):文件“/usr/lib/python2.7/genericpath.py”,第49行,在getsize return os.stat(filename.st_size OSError:[Errno 2]没有这样的文件或目录:'/var/www/vhosts/anon_ftp/incoming/Campobasso[CB]-Molise_u02-02-2016.zip'感谢这项工作正常,后面的行:
print“Transfer new{}->{}->{}.格式(全名公司,新条目)
添加了
shutil.copy2(全名公司,新条目)
来传输新文件。很好,我很高兴它成功了。我不是100%确定你需要什么,但我觉得这种方法更容易理解和适应你的需要。完成后,别忘了单击答案旁边的灰色勾号接受解决方案。