Проблема при создании Zip-файла с помощью glob.glob - PullRequest
1 голос
/ 24 мая 2010

Я создаю Zip-файл из папки (и подпапок). он работает нормально и создает новый файл .zip, но у меня возникла проблема при использовании glob.glob. Он читает все файлы из нужной папки (исходной папки) и записывает в новый zip-файл, но проблема в том, что он, однако, добавляет подкаталоги, а не добавляет файлы из подкаталогов.

Я даю пользователю возможность выбрать имя файла и путь, а также тип файла (Zip или Tar). У меня нет проблем при создании файла .tar.gz, но когда пользователь создает файл .zip, эта проблема встречается.

Вот мой код:

for name in (Source_Dir):
    for name in glob.glob("/path/to/source/dir/*" ):
        myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)

myZip.close()

Кроме того, если я использую код ниже:

for dirpath, dirnames, filenames in os.walk(Source_Dir):
        myZip.write(os.path.join(dirpath, filename) os.path.basename(filename))        

myZip.close()

Теперь второй код берет все файлы, даже если они находятся внутри папки / подпапок, создает новый файл .zip и записывает в него без какой-либо структуры каталогов. Он даже не принимает структуру dir для основной папки и просто записывает все файлы из основного каталога или подкаталога в этот файл .zip.

Может кто-нибудь, пожалуйста, помогите мне или предложите мне. Я бы предпочел использовать glob.glob, а не 2-й вариант.

Заранее спасибо.

С уважением, Акаша

1 Ответ

1 голос
/ 07 февраля 2011

Глобус по дизайну не распространяется на подкаталоги. Он следует правилам и расширениям в стиле UNIX, для получения дополнительной информации см. Документацию по fnmatch . Если вы хотите попасть в подкаталоги, вам нужно добавить его в путь. В этом примере все будет на одном уровне ниже.

for name in (Source_Dir):
    for name in glob.glob("/path/to/source/dir/*/*" ):
        myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)

myZip.close()

У Дуга Хеллмана отличная дискуссия здесь . Если вы не используете шаблонные возможности glob (например, * .txt для всех текстовых файлов или * [0-9] .txt для всех текстовых файлов, которые имеют номер перед расширением), то я думаю, что ваше решение os.walk лучше

...