Вы вызываете os.path.basename
для переменной пути. Это означает, что если вы пытаетесь сжать файл new/dir1/file1
, вы отбрасываете часть пути new/
и в итоге получаете dir1/file1
, который не является допустимым путем относительно вашего текущего каталога.
Если вы просто удалите вызов на os.path.basename
, он будет правильно архивировать файлы:
myzip.write(os.path.join(path, file))
... хотя это может быть не то, что вы хотите в zipfile с точки зрения путей. Если вы запустите свой os.walk
из каталога верхнего уровня, вы можете получить то, что вы хотите:
if __name__ == '__main__':
path=os.path.join(os.getcwd(), 'new')
myzip = zipfile.ZipFile('myzipped.zip', 'w')
# Change into the top level directory.
os.chdir(path)
zipfunc('.',myzip)
myzip.close()
С учетом такой иерархии:
/home/lars/new
file1
file2
dir1/
file1
file2
file3
Это создает ZIP-файл, который выглядит следующим образом:
Archive: myzipped.zip
Length Date Time Name
--------- ---------- ----- ----
29 11-02-2011 09:14 file1
29 11-02-2011 09:14 file2
29 11-02-2011 09:14 dir1/file3
29 11-02-2011 09:14 dir1/file1
29 11-02-2011 09:14 dir1/file2
--------- -------
145 5 files
Если ваша настоящая цель - архивировать файлы только на верхнем уровне и не спускаться в какие-либо подкаталоги, тогда вам действительно не нужно os.walk
. Вместо этого вы можете просто использовать os.listdir
и os.path.isfile
, чтобы убедиться, что вы имеете дело с файлами, а не с подкаталогами.