Переименовать файлы при распаковке zip архива

В zip архиве имеются файлы xml и pdf, мне нужно распаковать pdf с другим именем файла, к примеру: было наименование - "report-c123ba65-b3fb-4e61-b160-18a17e351f12-OfSite-2023-03-23-868902-52-01[0] ЭП.pdf", а нужно положить в папку с уже переименованным в - "52_18_0020026_1108 ЭП.pdf".

Помогите пожалуйста.


Новое наименование берется из xml файла:

with archive.open([_ for _ in archive.namelist() if _.endswith(find_xml)][0]) as line: # Находим все xml в архиве
            soup = BeautifulSoup(line.read(), features="xml")
            cad_n = '_'.join((soup.select_one('object common_data cad_number').text).split(':'))
            print(cad_n)

Вот мой полный код:

import zipfile
from bs4 import BeautifulSoup
from pathlib import Path
import os

find_xml = '.xml'
find_pdf = 'ЭП.pdf'

for path in Path(r'C:\Users\shirshov\Downloads').rglob('*.zip'):
    with zipfile.ZipFile(path, mode="r") as archive:
        with archive.open([_ for _ in archive.namelist() if _.endswith(find_xml)][0]) as line: # Находим все xml в архиве
            soup = BeautifulSoup(line.read(), features="xml")
            cad_n = '_'.join((soup.select_one('object common_data cad_number').text).split(':'))
            print(cad_n)
        archive.extract(([_ for _ in archive.namelist() if _.endswith(find_pdf)][0]), path=r'C:\Users\shirshov\Downloads\PDF')
# for pdf_ in ([_ for _ in archive.namelist() if _.endswith(find_pdf)][0]):
#     os.rename(file + pdf_, cad_n +'_'+ find_pdf)

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

Автор решения: Михаил Ширшов

Получилось это сделать, вот таким способом:

import zipfile
from bs4 import BeautifulSoup
from pathlib import Path
import os
import shutil

find_xml = '.xml'
find_pdf = 'ЭП.pdf'

for path in Path(r'C:\Users\shirshov\Downloads').rglob('*.zip'):
    with zipfile.ZipFile(path, mode="r") as archive:
        with archive.open([_ for _ in archive.namelist() if _.endswith(find_xml)][0]) as line: # Находим все xml в архиве
            soup = BeautifulSoup(line.read(), features="xml")
            cad_n = '_'.join((soup.select_one('object common_data cad_number').text).split(':'))
            file_newname = cad_n + '_' + find_pdf
            archive.extract(([_ for _ in archive.namelist() if _.endswith(find_pdf)][0]), path=r'C:\Users\shirshov\Downloads\PDF')
            file_oldname = os.path.join(r'C:\Users\shirshov\Downloads\PDF', ([_ for _ in archive.namelist() if _.endswith(find_pdf)][0]))
            file_newname_newfile = os.path.join(r'C:\Users\shirshov\Downloads\PDF', file_newname)
            newFileName=shutil.move(file_oldname, file_newname_newfile)
→ Ссылка