2012-06-28 10 views
5

mio programma senza intoppi, ma voglio che i miei file da FTP per essere zip nel mio disco localefile Zipping in pitone

mio problema: solo 1 file sia compresso dopo aver chiamato la mia funzione main()

Ecco il mio codice:

principale

import os 
import upload 
import download 
import zipfile 
import ConfigParser 
import ftputil 

def main(): 

    #create a folder Temp on d drive for later use 
    path = r'D:\Temp' 
    os.mkdir(path) 

    #parse all the values at config.ini file 
    config = ConfigParser.ConfigParser() 
    config.readfp(open('config.ini')) 
    server = config.get('main', 'Server') 
    username = config.get('main', 'Username') 
    password = config.get('main', 'Password') 
    uploads = config.get('main', 'Upload folder') 
    downloads = config.get('main', 'Download folder') 

    #connect to ftp 
    ftp = ftputil.FTPHost(server, username, password) 

    dirlist = ftp.listdir(downloads) 

    for list in dirlist: 
     ftp.chdir(downloads) 
     target = os.path.join(path, list) 
     ftp.download(list, target) 


    ######################################################### 
    # THis section is where algo fails but the program run# 
    ######################################################## 

    #zipping files 
    absolute_path = r'D:\Temp' 
    dirlist = os.listdir(absolute_path) 
    filepath = r'D:\Temp\project2.zip' 
    for list in dirlist: 
     get_file = os.path.join(absolute_path, list) 
     zip_name = zipfile.ZipFile(filepath, 'w') 
     zip_name.write(get_file, 'Project2b\\' + list) 




if __name__ == '__main__': 
    print "cannot be" 
+0

Ti archivia costituito da ultimo file 'target'? –

+0

Manca il metodo di compressione, zipfile.ZIP_DEFLATED se non viene fornito, i file non verranno compressi. Dovrebbe essere zipfile.ZipFile (filepath, 'w', zipfile.ZIP_DEFLATED) per includere la compressione –

risposta

6

Quando si esegue questa operazione:

for list in dirlist: 
     get_file = os.path.join(absolute_path, list) 
     zip_name = zipfile.ZipFile(filepath, 'w') 
     zip_name.write(get_file, 'Project2b\\' + list) 

si ricrea uno ZipFile per ogni file che si desidera comprimere, la modalità "w" significa ricreare da zero.

Prova questa (crezate il file zip prima del ciclo):

zip_name = zipfile.ZipFile(filepath, 'w') 
for list in dirlist: 
     get_file = os.path.join(absolute_path, list) 
     zip_name.write(get_file, 'Project2b\\' + list) 

O questo aperto, il file zip in accodamento:

for list in dirlist: 
     get_file = os.path.join(absolute_path, list) 
     zip_name = zipfile.ZipFile(filepath, 'a') 
     zip_name.write(get_file, 'Project2b\\' + list) 
+0

Sì! questo funziona !! Mi dispiace per essere un principiante! Non riesco ancora a fare clic sul pulsante di risposta migliore, attendere 3 minuti. : D Grazie ancora! – neo

0

il modo migliore per farlo è mettendo istruzioni di debug al vostro per cicli, ci sono due possibilità;

uno è che la prima forloop scarica solo un file dalla cartella ftp

due è che il primo ciclo download di tutti i file, ma secondo zip anello solo uno di loro

dichiarazioni utilizzo di stampa per vedere quali file sono scaricati/zippati ai loop, buona fortuna

+0

grazie per il consiglio, ci proverò. In realtà il primo ciclo va bene, scarica tutti i file nel mio ftp ma il secondo ciclo è il problema – neo

+0

Nessun problema, buona giornata! – serdarsenay