2016-07-02 4 views
1

Мне нужен только один подтекст в каждом из 500 zipfiles, пути такие же, как:Как скопировать файл в zipfile в определенный каталог?

120132.zip/A/B/C/target_file 
212332.zip/A/B/C/target_file 
.... 

Как скопировать все эти целевые файлы в один каталог? Сохраняя весь путь в новый каталог будет лучшее, что я имею в виду:

target_dir/ 
    120132/A/B/C/target_file 
    212332/A/B/C/target_file 
    ...... 

Я пробовал с модулями Python ZipFile и shutil

Однако CopyFile из shutil принимает весь путь как аргумент, но когда я попытался напрямую скопировать целевой файл, он поднимет ошибку filenotfind. При распаковке zipfile.Zipfile целевой файл будет доступен, но copyfile становится недействительным.

Как я могу сделать это правильно и эффективно?

ответ

3

ZipFile.extract принимает необязательный path указания в каком каталоге он будет извлечь файл:

import os 
import zipfile 

zip_filepath = ['120132.zip', '212332.zip', ...] # or glob.glob('...zip') 
target_dir = '/path/to/target_dir' 

for path in zip_filepath: 
    with zipfile.ZipFile(path) as zf: 
     dirname = os.path.join(
      target_dir, os.path.splitext(os.path.basename(path))[0] 
     ) 
     zf.extract('A/B/C/target_file', path=dirname) 
+0

Да! Это то, чего я хочу! extract() имеет смысл. Спасибо! – Spike

+0

Я столкнулся с другой проблемой. Я выполнил «zf.extract (r« A \ B \ C \ имя_файла », ..)» на окнах, но это не удалось, сказав: «Нет элемента с именем« A \\\\ B \\\\ C \\ \\имя файла'". Не могли бы вы дать мне совет? @falsetru – Spike

+0

@Spike, вы уверены, что все zip-файлы содержат этот файл? Сбой с самого начала? Возможно, вам придется проверить его перед вызовом 'extract' или использовать' try ... except ...'. – falsetru