Переименование архива 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()
Буду работать дальше.