Python: разархивировать выбранные файлы в дереве каталогов

У меня есть следующий каталог, в родительском каталоге есть несколько папок, скажем, ABCD, и внутри каждой папки много почтовых индексов с отображаемыми именами и буквой родительской папки, включенной в имя вместе с другой информацией:

-parent--A-xxxAxxxx_timestamp.zip
          -xxxAxxxx_timestamp.zip
          -xxxAxxxx_timestamp.zip
       --B-xxxBxxxx_timestamp.zip
          -xxxBxxxx_timestamp.zip
          -xxxBxxxx_timestamp.zip
       --C-xxxCxxxx_timestamp.zip
          -xxxCxxxx_timestamp.zip
          -xxxCxxxx_timestamp.zip
       --D-xxxDxxxx_timestamp.zip
          -xxxDxxxx_timestamp.zip
          -xxxDxxxx_timestamp.zip

Мне нужно распаковать только выбранные молнии в этом дереве и поместить их в тот же каталог с тем же именем без расширения.zip.

Выход:

-parent--A-xxxAxxxx_timestamp
          -xxxAxxxx_timestamp
          -xxxAxxxx_timestamp
       --B-xxxBxxxx_timestamp
          -xxxBxxxx_timestamp
          -xxxBxxxx_timestamp
       --C-xxxCxxxx_timestamp
          -xxxCxxxx_timestamp
          -xxxCxxxx_timestamp
       --D-xxxDxxxx_timestamp
          -xxxDxxxx_timestamp
          -xxxDxxxx_timestamp

Мои усилия:

for path in glob.glob('./*/xxx*xxxx*'): ##walk the dir tree and find the files of interest

    zipfile=os.path.basename(path) #save the zipfile path
    zip_ref=zipfile.ZipFile(path, 'r') 
    zip_ref=extractall(zipfile.replace(r'.zip', '')) #unzip to a folder without the .zip extension

Проблема в том, что я не знаю, как сохранить A,B,C,D и т. Д., Чтобы включить их в путь, по которому файлы будут разархивированы. Таким образом, разархивированные папки создаются в родительском каталоге. Есть идеи?

2 ответа

Решение

Код, который у вас есть, работает нормально, вы просто убедитесь, что вы не переопределяете имена переменных и не используете правильные. Следующий код прекрасно работает для меня

import os
import zipfile
import glob

for path in glob.glob('./*/xxx*xxxx*'): ##walk the dir tree and find the files of interest

    zf = os.path.basename(path) #save the zipfile path
    zip_ref = zipfile.ZipFile(path, 'r') 
    zip_ref.extractall(path.replace(r'.zip', '')) #unzip to a folder without the .zip extension

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

import os.path
for folder in glob.glob("./*"):
    #Using *.zip to only get zip files
    for path in glob.glob(os.path.join(".",folder,"*.zip")):
        filename = os.path.split(path)[1]
        if folder in filename:
            #Do your logic
Другие вопросы по тегам