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