Python: распаковать выбранные файлы в дереве каталогов

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

-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-архивы в этом дереве и поместить их в тот же каталог с тем же именем без расширения .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 и т. Д., Чтобы включить их в путь, по которому файлы будут распакованы. Таким образом, в родительском каталоге создаются распакованные папки. Любые идеи?


person balalaika    schedule 17.08.2017    source источник
comment
Вместо того, чтобы пытаться сделать это за один раз, сначала получите список всех папок внутри ., затем получите список всех файлов внутри каждой папки и проверьте, встречается ли в ней имя папки.   -  person Anand S Kumar    schedule 17.08.2017


Ответы (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
person BlueEagle    schedule 17.08.2017

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

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
person Anand S Kumar    schedule 17.08.2017