使用Python将文件列表添加到zip文件中
我想编写一个脚本,将所有“.py”文件添加到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
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