2012-06-28 25 views
5

Mi buen funcionamiento del programa, pero quiero mis archivos de ftp para ser cremallera en mi unidad localComprimir archivos en pitón

Mi Problema: Sólo 1 archivo está siendo comprimido después de llamar a mi función main()

Aquí es mi código:

principal

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

¿Es archivar que consistirá en último archivo 'target'? –

+0

Falta el método de compresión, zipfile.ZIP_DEFLATED si no se proporciona, los archivos no se comprimirán. Debe ser zipfile.ZipFile (filepath, 'w', zipfile.ZIP_DEFLATED) para incluir compresión –

Respuesta

6

Al hacer esto:

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) 

vuelve a crear un ZipFile para cada archivo que desea comprimir, el modo "w" significa que vuelva a crear desde cero.

probar este (crezate el archivo zip antes de la circular):

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 esta abierto, el archivo zip en la modalidad de apertura:

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í! ¡¡esto funciona!! Lo siento por ser un novato! Todavía no puedo hacer clic en el botón de la mejor respuesta, esperar 3 minutos. : D ¡De nuevo, gracias! – neo

0

mejor manera de hacerlo es poniendo instrucciones de depuración en su bucles, hay dos posibilidades;

una es que el primer forloop sólo se descarga un archivo de la carpeta FTP

dos es que las descargas del primer bucle todos los archivos, pero la segunda cremalleras de bucle sólo uno de ellos

declaraciones utilización de impresión para ver qué archivos se descargan/se comprimen en los bucles, buena suerte

+0

gracias por el consejo, lo intentaré. En realidad, el primer ciclo está bien, descarga todos los archivos en mi ftp pero el segundo ciclo es el problema – neo

+0

¡No hay problema, que tengas un buen día! – serdarsenay

Cuestiones relacionadas