Архивирование файлов из набора с использованием zipfile - PullRequest
1 голос
/ 30 мая 2019

Мне нужно сжать определенные файлы на пути все вместе.Мне нужно найти определенные файлы (например: AAA.txt, BBB.inf и т. Д.) За исключением тех, которые содержат SFF в имени, а затем сжать их все вместе.

Каждый раз, когда я запускаю этот файлЯ получаю DB.zip с CCC.txt внутри.Это означает, что каждый раз, когда скрипт находит файл из набора, он создает новый DB.zip с этим новым файлом внутри, перезаписывая предыдущий.Как я могу это исправить?

import os
import zipfile

pr_directory = r'C:\Users\vijo9001\Desktop\Infact'
pr_path = os.listdir(pr_directory)
dst = r'C:\Users\vijo9001\Desktop\Infact'
os.chdir(r'C:\Users\vijo9001\Desktop\Infact')

my_set = {
"AAA",
"BBB",
"CCC"
}

for file in pr_path:
    zip_file = pr_directory + '/' + 'DB.zip'
    for x in my_set:
        if 'SFF' in file:
            continue
        if (str(x)) in file:
           zip = zipfile.ZipFile(zip_file, "w",)
           zip.write(file, compress_type=zipfile.ZIP_DEFLATED)
           zip.close()

1 Ответ

0 голосов
/ 30 мая 2019

В вашем коде я обнаружил несколько моментов, которые вы, возможно, захотите оптимизировать / исправить:

  1. zip создается в каждой итерации через циклы for, переопределяя друг друга.Это означает, что вы создадите файл DB.zip для файла "AAA1.txt", затем перезапишите его файлом DB.zip, содержащим только файл "AAA2.txt", и так далее.Инициируя zip перед циклами for, вы добавляете каждый файл по очереди, генерируя один файл DB.zip, содержащий все файлы.
  2. Вместо цикла for для каждого элемента в my_set, вы можете использовать простой if-оператор со следующим условием: if any(x in file_split for x in my_set)
  3. zip_file нужно будет только переместить перед тем, как циклы for правильно объявят zip
  4. zip затеняет библиотеку zip, для лучшегоЧтобы избежать ошибок, было бы лучше переименовать переменную (я использовал zip_dir в приведенном ниже коде)

Я немного поиграл с вашим кодом и придумал следующий фрагмент:

my_set = {"AAA", "BBB", "CCC"}

zip_file = pr_directory + '/' + 'DB.zip'
zip_dir = zipfile.ZipFile(zip_file, "w",)

for file in pr_path:
    if 'SFF' in file:
        continue
    if any(x in file for x in my_set):
        zip_dir.write(file, compress_type=zipfile.ZIP_DEFLATED)

zip_dir.close()

Мне кажется, это работает нормально.Надеюсь, я вам помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...