Использование Python для добавления списка файлов в zip файл

Я хочу написать script, чтобы добавить все .py файлы в zip файл.

Вот что у меня есть:

import zipfile
import os

working_folder = 'C:\\Python27\\'

files = os.listdir(working_folder)

files_py = []

for f in files:
    if f[-2:] == 'py':
        fff = working_folder + f
        files_py.append(fff)

ZipFile = zipfile.ZipFile("zip testing.zip", "w" )

for a in files_py:
    ZipFile.write(a, zipfile.ZIP_DEFLATED)

Однако это дает ошибку:

Traceback (most recent call last):
  File "C:\Python27\working.py", line 19, in <module>
    ZipFile.write(str(a), zipfile.ZIP_DEFLATED)
  File "C:\Python27\lib\zipfile.py", line 1121, in write
    arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
  File "C:\Python27\lib\ntpath.py", line 125, in splitdrive
    if p[1:2] == ':':
TypeError: 'int' object has no attribute '__getitem__'

поэтому кажется, что имена файлов неверны.

Ответ 1

Вам нужно передать тип сжатия в качестве аргумента ключевого слова:

ZipFile.write(a, compress_type=zipfile.ZIP_DEFLATED)

Без аргумента ключевого слова вы даете ZipFile.write() целочисленный аргумент arcname вместо этого, и это вызывает ошибку, которую вы видите при нормализации arcname.

Ответ 2

в соответствии с приведенным выше руководством, окончательный вариант: (просто соединяя их, если это может быть полезно)

import zipfile
import os

working_folder = 'C:\\Python27\\'

files = os.listdir(working_folder)

files_py = []

for f in files:
    if f.endswith('py'):
        fff = os.path.join(working_folder, f)
        files_py.append(fff)

ZipFile = zipfile.ZipFile("zip testing3.zip", "w" )

for a in files_py:
    ZipFile.write(os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)