I want to write a script to add all the '.py' files into a zip file.
Here is what I have:
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)
However it gives an error:
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__'
so seems the file names given is not correct.
You need to pass in the compression type as a keyword argument:
ZipFile.write(a, compress_type=zipfile.ZIP_DEFLATED)
Without the keyword argument, you are giving ZipFile.write()
an integer arcname
argument instead, and that is causing the error you see as the arcname
is being normalised.
original answered Sep 2 '14 at 3:52
according to the guidance above, the final is: (just putting them together in case it could be useful)
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)
ZipFile.close()
added in Mar 2020 enlightened by @jinzy at zip file and avoid directory structure , the last line of above changed to below to avoid file structures in the zip file.
ZipFile.write(a, "C:\\" + os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.