Сжатие файлов в 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)
лучший способ сделать это-поместить операторы отладки в циклы for, есть две возможности;
один из них заключается в том, что первый forloop загружает только один файл из папки ftp
два заключается в том, что первый цикл загружает все файлы, но второй цикл молнии только один из них
используйте инструкции печати, чтобы увидеть, какие файлы загружаются / молнии в циклах, удачи