Для проблемы # 1, я думаю, что ваша проблема, вероятно, заключается в следующем разделе:
cod = zipfile.ZipFile("COD.zip","a")
cod.write(currentFile)
Вы создаете новый zip (и, возможно, перезаписываете существующий) каждый раз, когда вы идете, чтобы написать новый файл,Вместо этого вы хотите создать zip один раз для каждого каталога, а затем несколько раз добавлять к нему (см. Пример ниже).
Для проблемы # 2 ваша проблема заключается в том, что вам, вероятно, нужно сгладить имя файла при записи его вархив.Один из подходов заключается в использовании os.chdir
для CD в каждый каталог в scandirs
, как вы на это смотрите.Более простой подход - использовать модуль os.path
, чтобы разделить путь к файлу и получить базовое имя (имя файла без пути), а затем вы можете использовать 2-й параметр для cod.write
, чтобы изменить имя файла, которое вставляется в фактическийzip (см. пример ниже).
import os, os.path, glob, fnmatch, zipfile
def scandirs(path):
#zip file goes at current path, then up one dir, then COD.zip
zip_file_path = os.path.join(path,os.path.pardir,"COD.zip")
cod = zipfile.ZipFile(zip_file_path,"a") #NOTE: will result in some empty zips at the moment for dirs that contain no .cod files
for currentFile in glob.glob( os.path.join(path, '*') ):
if os.path.isdir(currentFile):
scandirs(currentFile)
if fnmatch.fnmatch(currentFile, '*.cod'):
cod.write(currentFile,os.path.basename(currentFile))
cod.close()
if not cod.namelist(): #zip is empty
os.remove(zip_file_path)
scandirs(os.getcwd())
Создайте zip-файл один раз, несколько раз добавляйте его, выравнивая имена файлов, затем закрывайте его.Вы также должны убедиться, что вы звоните близко, иначе вы можете не записать все свои файлы.
У меня нет хорошего способа проверить это локально, так что не стесняйтесь попробовать это и доложить,Я уверен, что, наверное, что-то сломал.; -)