使用Python将文件列表添加到zip文件中

使用Python将文件列表添加到zip文件中,python,zipfile,Python,Zipfile,我想编写一个脚本,将所有“.py”文件添加到zip文件中 ZipFile.write(a, "C:\\" + os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED) 以下是我所拥有的: import zipfile import os working_folder = 'C:\\Python27\\' files = os.listdir(working_folder) files_py = [] for f

我想编写一个脚本,将所有“.py”文件添加到zip文件中

ZipFile.write(a, "C:\\" + os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)
以下是我所拥有的:

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__'
回溯(最近一次呼叫最后一次):
文件“C:\Python27\working.py”,第19行,在
ZipFile.write(str(a),ZipFile.ZIP_DEFLATED)
写入文件“C:\Python27\lib\zipfile.py”,第1121行
arcname=os.path.normpath(os.path.splitdrive(arcname)[1])
splitdrive中第125行的文件“C:\Python27\lib\ntpath.py”
如果p[1:2]==':':
TypeError:“int”对象没有属性“\uuuu getitem\uuuu”

因此,给出的文件名似乎不正确。

您需要将压缩类型作为关键字参数传入:

ZipFile.write(a, compress_type=zipfile.ZIP_DEFLATED)
如果没有关键字参数,您将给
ZipFile.write()
一个整数
arcname
参数,这将导致您看到的错误,因为
arcname
正在正常化。

原始答案于2014年9月2日3:52

根据上述指导,最终结果是: (只是把它们放在一起以防有用)

于2020年3月添加 受@jinzy at的启发,上面的最后一行改为下面,以避免zip文件中的文件结构

ZipFile.write(a, "C:\\" + os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)

请注意,使用os.path.join(working_folder,f)生成真正的路径,不要直接使用字符串连接“+”@MarkK:with
os.path()
您的代码可以更轻松地跨平台生成,因为库会处理正确的路径分隔符。您也不需要太在意在
工作文件夹的末尾提供路径分隔符
@MarkK:同样,您可以使用
str.endswith()
而不是切片:
如果f.endswith('.py'):
@MarkK:和
ZipFile
不需要将任何内容收集到一个文件夹中。您可以给它任何文件列表,然后提供第二个
arcname
参数来指定归档文件中的文件名(带路径)
os.path.basename()
可以将所有文件放在一个平面层次结构中。@MarkK正如Martin大师所说:D您的代码将是跨平台的,不会中断您在windows或linux上的运行,而且它也比直接处理字符串要好,因为您不必添加额外的检查。查看有关os.path函数的文档,您将在那里找到一些非常好的信息,干杯!在for循环之后,应该使用ZipFile.close()关闭ZipFile