Библиотека zip-файлов Python - создайте zip-файл только с файлами .pdf и .xml из одного каталога.

Я хотел бы знать, как я могу заархивировать только все PDF-файлы из основного каталога, не включая подпапки.

Я несколько раз пытался изменить код, но безуспешно.

import zipfile

fantasy_zip = zipfile.ZipFile('/home/rob/Desktop/projects/zenjobv2/archivetest.zip', 'w')

for folder, subfolders, files in os.walk('/home/rob/Desktop/projects/zenjobv2/'):

    for file in files:
        if file.endswith('.pdf'):
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), '/home/rob/Desktop/projects/zenjobv2/'), compress_type = zipfile.ZIP_DEFLATED)
        elif file.endswith('.xml'):
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), '/home/rob/Desktop/projects/zenjobv2/'), compress_type = zipfile.ZIP_DEFLATED)
fantasy_zip.close()

Я ожидаю, что zip создается только с файлами .pdf и .xml из папки/каталога zenjobv2 без включения каких-либо других папок/подпапок.

(Отредактировано) Решение:

import os, glob
import zipfile

fantasy_zip = zipfile.ZipFile('/home/rob/Desktop/projects/zenjobv2/archivetest.zip', 'w')

root = "/home/rob/Desktop/projects/zenjobv2"

for file in os.listdir(root):
    if file.endswith('.pdf') or file.endswith(".xml"):
        fantasy_zip.write(file)
fantasy_zip.close()

person Robert F.    schedule 02.10.2019    source источник


Ответы (1)


Обновлено новой информацией из OP:

Вы перебираете все дерево каталогов с помощью os.walk(). Похоже, вы хотите просто посмотреть файлы в данном каталоге. Для этого рассмотрим os.scandir(), который возвращает итератор всех файлы и подкаталоги в заданном каталоге. Вам просто нужно отфильтровать элементы, которые являются каталогами:

root = "/home/rob/Desktop/projects/zenjobv2"
for entry in os.scandir(root):
    if entry.is_dir():
        continue  # Just in case there are strangely-named directories
    if entry.path.endswith(".pdf") or entry.path.endswith(".xml"):
        # Process the file at entry.path as you see fit

Предыдущий ответ, основанный на плохом понимании вопроса:

Вы неявно указываете arcname аргумент в своем вызове на ZipFile.write(), который создаст файл в архиве с точно указанным вами путем, подкаталогами и всем остальным. Если файл, который вы добавляете в архив, находится по пути /home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf, то используйте определение os.path.relpath() ваш код фактически преобразуется в:

fantasy_zip.write("/home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf",
                  arcname="subdir1/subdir2/file.pdf",
                  compress_type=zipfile.ZIP_DEFLATED)

Поскольку в аргументе arcname есть разделители каталогов, файл будет добавлен в архив в подкаталог с именем subdir1/subdir2.

Вероятно, вы намереваетесь сделать что-то вроде этого:

fantasy_zip.write(os.path.join(folder, file), arcname=file)

Это оставит структуру каталогов вне архива. Однако имейте в виду, что файлы с одинаковыми именами будут перезаписаны.

person PaSTE    schedule 02.10.2019
comment
спасибо, я проверю это. У вас есть идея, как искать файлы .pdf и .xml только в основном каталоге БЕЗ поиска файлов .pdf/.xml в subdir1 и subdir2. Заранее спасибо. - person Robert F.; 02.10.2019
comment
Вы перебираете подкаталоги с помощью os.walk(), который будет проходить через все дерево каталогов. Вместо этого рассмотрите os.listdir(). - person PaSTE; 02.10.2019