Python - поиск файлов и ZIP по нескольким каталогам - PullRequest
1 голос
/ 25 ноября 2010

Это мой первый раз, когда я собираю кусочки кода, чтобы создать нужную мне утилиту (я по профессии дизайнер), и, хотя я чувствую, что я близок, у меня возникают проблемы с получением следующего работа.

Мне обычно нужно архивировать файлы с расширением .COD, которые находятся внутри структуры каталогов, которую я создал. Например, структура может выглядеть так:

(одна корневая папка) -> (несколько папок) -> (две папки) -> (одна папка) -> COD файлы

Мне нужно заархивировать все COD-файлы в COD.zip и поместить этот zip-файл на один каталог выше того места, где находятся файлы. Структура папки будет выглядеть следующим образом, например:

папка EXPORT -> папка 9800 -> папка 6 -> папка OTA (+ новый COD.zip) -> файлы COD

Мои проблемы -

Во-первых, создаваемый им COD.zip кажется подходящим для файлов COD внутри него, но когда я его распаковываю, внутри остается только 1 .cod, но размер файла этого ZIP равен размеру всех сжатых COD все вместе.

во-вторых, мне нужно, чтобы файлы COD были заархивированы без какой-либо структуры папок - только непосредственно в COD.zip. В настоящее время мой сценарий создает всю структуру каталогов (начиная с «users / mysuername / etc etc»).

Любая помощь будет принята с благодарностью - и объяснения еще лучше, поскольку я пытаюсь учиться:)

Спасибо.

import os, glob, fnmatch, zipfile


def scandirs(path):
for currentFile in glob.glob( os.path.join(path, '*') ):
    if os.path.isdir(currentFile):
        scandirs(currentFile)
    if fnmatch.fnmatch(currentFile, '*.cod'):
            cod = zipfile.ZipFile("COD.zip","a")
            cod.write(currentFile)


scandirs(os.getcwd())

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Следующий код имеет тот же эффект, но более пригоден для повторного использования и не создает несколько zip-файлов.

import os,glob,zipfile

def scandirs(path, pattern):
    result = []
    for file in glob.glob( os.path.join( path, pattern)):
        if os.path.isdir(file):
            result.extend(scandirs(file, pattern))
        else:
             result.append(file)
     return result


zfile = zipfile.ZipFile('yourfile.zip','w')
for file in scandirs(yourbasepath,'*.COD'):
    print 'Processing file: ' + file
    zfile.write(file)                   # folder structure
    zfile.write(file, os.path.split(file)[1])   # no folder structure

zfile.close()
1 голос
/ 25 ноября 2010

Для проблемы # 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-файл один раз, несколько раз добавляйте его, выравнивая имена файлов, затем закрывайте его.Вы также должны убедиться, что вы звоните близко, иначе вы можете не записать все свои файлы.

У меня нет хорошего способа проверить это локально, так что не стесняйтесь попробовать это и доложить,Я уверен, что, наверное, что-то сломал.; -)

...