PDA

View Full Version : [python] zippare uno per uno i file di una cartella


cybergabry
27-07-2010, 16:07
Ciao a tutti,
spero mi possiate essere d'aiuto. Non sono molto pratico di python.
Dovrei realizzare uno script che zippi singolarmente i file contenuti in una cartella mantenendo lo stesso nome per ciascun file e lo stesso path.
Per es:
In c:\input si trovano i file:
file 1.txt
file 2.txt
file 3.txt
...
Lo script deve creare nella stessa cartella i file:
file 1.zip
file 2.zip
file 3.zip
...

Il seguente script:
import os, zipfile

path = 'c:\\input\\'
zip = zipfile.ZipFile('c:\\alltogether.zip', 'w')
for each in os.listdir(path):
try:
zip.write(path + each)
except IOError: None

zip.close()

che sono riuscito a mettere insieme grazie ad articoli trovati sulla rete, zippa tutti i file della cartella input in un unico file zip dal nome fisso "alltogether.zip", quindi non riesco ad ottenere quello che voglio.
Se riuscite a darmi una mano...
Grazie anticipatamente.
Gabriele

kk3z
27-07-2010, 16:25
Non conosco python ma posso provare...

import os, zipfile

path = 'c:\\input\\'
for file in os.listdir(path):
try:
zipfile = file[0:-3] + "zip"
zip = zipfile.ZipFile(path + zipfile, 'w')
zip.write(path + file)
zip.close()
except IOError: None

cybergabry
27-07-2010, 16:49
Non conosco python ma posso provare...

import os, zipfile

path = 'c:\\input\\'
for file in os.listdir(path):
try:
zipfile = file[0:-3] + "zip"
zip = zipfile.ZipFile(path + zipfile, 'w')
zip.write(path + file)
zip.close()
except IOError: None


Ti ringrazio tanto per l'aiuto. Purtroppo c'è qualcosa che non va. Quando mando in esecuzione mi da un errore sulla riga

zip = zipfile.ZipFile(path + zipfile, 'w')

perchè l'argomento non è str. Penso significhi che non è una stringa.

Ryuzaki_Eru
27-07-2010, 18:40
Puoi fare una cosa di questo tipo, anche se si può migliorare:

import os, zipfile

path = 'c:\\input\\'
for elem in os.listdir(path):
try:

zip = zipfile.ZipFile(path + elem, 'w')
zip.write(path + elem)
zip.close()
except IOError: None

kk3z
28-07-2010, 09:42
Puoi fare una cosa di questo tipo, anche se si può migliorare:

Ma così non sovrascrive il file originale senza cambiare estensione?

kk3z
28-07-2010, 11:26
Ti ringrazio tanto per l'aiuto. Purtroppo c'è qualcosa che non va. Quando mando in esecuzione mi da un errore sulla riga

zip = zipfile.ZipFile(path + zipfile, 'w')

perchè l'argomento non è str. Penso significhi che non è una stringa.

Strano, ho provato ed è una stringa:
http://codepad.org/rpyRZFUr

EDIT: oops ho chiamato la stringa come l'import... :dentone:
import os, zipfile

path = 'c:\\input\\'
for file in os.listdir(path):
try:
filezip = file[0:-3] + "zip"
zip = zipfile.ZipFile(path + filezip, 'w')
zip.write(path + file)
zip.close()
except IOError: None

Ryuzaki_Eru
28-07-2010, 12:30
Ma così non sovrascrive il file originale senza cambiare estensione?

Si, infatti il codice era solo un esempio di funzionamento(che ho scritto oltretutto mentre la mia ragazza mi aspettava sotto la porta). Poi lui lo adatta alle sue esigenze.

Comunque si, il tuo problema era che avevi chiamato la variabile come il nome del modulo. Solo che non ho avuto tempo di scriverlo :asd:

cybergabry
28-07-2010, 15:01
Vi ringrazio tantissimo dell'aiuto. Caspita che professionalità in questo forum.
Tutto risolto:D :D :D

Ryuzaki_Eru
28-07-2010, 17:06
Strano, ho provato ed è una stringa:
http://codepad.org/rpyRZFUr

EDIT: oops ho chiamato la stringa come l'import... :dentone:
import os, zipfile

path = 'c:\\input\\'
for file in os.listdir(path):
try:
filezip = file[0:-3] + "zip"
zip = zipfile.ZipFile(path + filezip, 'w')
zip.write(path + file)
zip.close()
except IOError: None

Due piccole correzioni:

import os, os.path, zipfile

path = 'c:\\input\\'
for elem in os.listdir(path):
try:
filezip = os.path.splitext(elem)[0] + "zip"
zip = zipfile.ZipFile(path + filezip, 'w')
zip.write(path + elem)
zip.close()
except IOError: None