2014-08-28 10 views
10

Desidero scrivere uno script per aggiungere tutti i file ".py" in un file zip.Utilizzo di Python per aggiungere un elenco di file in un file zip

Ecco quello che ho:

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) 

tuttavia dà un errore:

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__' 

così sembra i nomi dei file indicate non è corretta.

+0

quale linea? mostra la traccia completa – WeaselFox

+0

ah, signor Pieters, come stai? è il vero nome. Ho provato a cambiarlo in "testing.zip", né funzionante. –

+0

@MarkK: Sì, ho già scontato che nel frattempo, mi dispiace di averlo chiesto senza verificare cosa sia 'arcname' nella fonte. Ho individuato il problema già, vedi la mia risposta. –

risposta

12

è necessario passare al tipo di compressione come argomento parola chiave:

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

Senza la parola chiave argomento, si stanno dando ZipFile.write() un intero arcname argomento, invece, e che causa l'errore che si vede come il arcname viene normalizzato.

5

secondo le indicazioni sopra, la finale è: (semplicemente mettendo insieme in caso potrebbe essere utile)

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)