2015-10-12 3 views
0

Что мне не хватает в этом коде (# вместо строки с комментариями в коде), чтобы файл test.py архивировался в zip-папке?создание zip-архива в python

#!/usr/bin/python 
import zipfile,os 
path='/home/user/Desktop' 

def zipdir(path, zipf): 
    for file in os.walk(path): 
    #zipf.write(os.path.join(root,path)) 




if __name__ == "__main__": 

    zipf = zipfile.ZipFile('test.zip', 'w') 
    zipdir(path, zipf) 
    zipf.close() 
+2

http://stackoverflow.com/questions/1855095/how-to-create-a-zip- archive-of-a-directory – user1514631

+0

@ user1514631 Почему в этом вопросе написано root вместо пути, внутри os.path.join? Можете ли вы объяснить мне эту часть? – commandos2389

+0

os.walk (путь) возвращает список кортежей, первый элемент этого кортежа - это текущий каталог (который некорректно вызывает корень, и это изменяется, когда os.walk спускается в директории), путем объединения текущего корня с текущим filename, вы получите полный путь к текущему файлу. «Переменный» путь в связанном ответе - это начальный каталог, где начинается os.walk. Чтобы получить лучшее понимание, просто распечатайте корни, dirs, файлы в вашей zipdir-функции, таким образом вы обязательно увидите, что происходит. – user1514631

ответ

1

Проблема заключается в том, что вы не распаковывать все переменные, возвращаемые функцией os.walk(), так что вы хотите сказать, программу пронестись кортежи, а не пути. Вы должны сделать следующие изменения в функции zipdir():

def zipdir(path, ziph): 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      ziph.write(os.path.join(root,file)) 

Проверьте следующий ответ: How to create a zip archive of a directory

+0

Почему в этом ответе (по ссылке, которую вы мне предоставили) написано root вместо пути, внутри os.path.join? Можете ли вы объяснить мне эту часть лучше, я не понимаю? – commandos2389

+0

Извините, это происходит из моего кода, когда я запускал его на компьютере с использованием разных переменных. Правильное выражение: 'ziph.write (os.path.join (путь, файл))'. Эта функция в основном создает весь путь к каждому из файлов в каталоге. 'os.walk()' возвращает кортеж из трех элементов. Первый - это весь путь к каталогу, который находится в списке, второй - подкаталоги внутри каталога, а третий - имена файлов. Чтобы сделать zip, вы должны указать весь путь к каждому файлу, поэтому вам нужно «присоединить» путь к каталогу ('root') в' файл'. Я исправил свой ответ;) –