Переименование архива ZIP после открытия

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

Вот что я наработал на скорую руку:

import os
import zipfile

from lxml import etree

folder = r"D:/Переименование массивов/"
file = r".xml"

list_zip = [os.path.join(folder, _) for _ in os.listdir(folder)]


def main():
    for zip_file in list_zip:
        list_tags = []
        try:
            with zipfile.ZipFile(zip_file, 'r') as zf:
                for name in zf.namelist():
                    if name.endswith(file):
                        xml_file = zf.open(name, 'r')
                        tree = etree.parse(xml_file)
                        tags = tree.xpath('*//ПоПодразделению|*//ТипДокумента')
                        for tag in tags:
                            tuple_tags = tag.tag, tag.text
                            list_tags.append(tuple_tags)
            return rename_zip(list_tags, zip_file)

        except zipfile.BadZipfile as error:
            print(error)


def rename_zip(list_tags, zip_file):
    if list_tags[0] == list_tags[2] and list_tags[3][1] == 'Вариант_1':
        print('Массив 1!')
        os.rename(zip_file, 'Вариант_1.zip')
    if list_tags[0] == list_tags[2] and list_tags[3][1] == 'Вариант_2':
        print('Массив 2!')
        os.rename(zip_file, 'Вариант_2.zip')
    return print(zip_file)


print(main())

Выдает ошибку:

PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'D:/Переименование массивов/zipSEDfiles6258.zip' -> 'Вариант_1.zip'

Если же я добавляю zf.close() в функцию main то пишет что ZIP файл уже закрыт.


Ответы (1 шт):

Автор решения: Kage

Все проблему решил. Всем спасибо. Я закрывал не тот файл

def main():
    for zip_file in list_zip:
        list_tags = []
        try:
            with zipfile.ZipFile(zip_file, 'r') as zf:
                for name in zf.namelist():
                    if name.endswith(file):
                        xml_file = zf.open(name, 'r')
                        tree = etree.parse(xml_file)
                        tags = tree.xpath('*//ПоПодразделению|*//ТипДокумента')
                        for tag in tags:
                            tuple_tags = tag.tag, tag.text
                            list_tags.append(tuple_tags)
                        xml_file.close()
            return rename_zip(list_tags, zip_file)

        except zipfile.BadZipfile as error:
            print(error)

Вот так должно быть. xml_file.close()

Буду работать дальше.

→ Ссылка