Сжатие файлов в python

моя программа работает гладко, но я хочу, чтобы мои файлы с ftp были zip в моем локальном диске

моя проблема : после вызова функции main ()

вот мой код:

main

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:Tempproject2.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"

3 ответов


при этом :

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)

вы воссоздаете ZipFile для каждого файла, который вы хотите zip,"w" режим означает, что вы воссоздать его с нуля.

попробуйте это (crezate zip-файл перед циклом):

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)

или этот открытый, zipfile в режиме добавления:

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)

взгляните на модуль shutil. Существует пример использования shutil.make_archive():

http://docs.python.org/library/shutil.html


лучший способ сделать это-поместить операторы отладки в циклы for, есть две возможности;

один из них заключается в том, что первый forloop загружает только один файл из папки ftp

два заключается в том, что первый цикл загружает все файлы, но второй цикл молнии только один из них

используйте инструкции печати, чтобы увидеть, какие файлы загружаются / молнии в циклах, удачи