2015-01-29 3 views
0

Согласно документации Python:Python и ZipFile модуль

ZipFile.extract (член [, путь [, PWD]]) Извлечение элемента из архива в текущий рабочий каталог; член должен быть его полным именем или объектом ZipInfo). Информация о файле извлекается как можно точнее. путь указывает другой каталог для извлечения в. член может быть имя файла или объект ZipInfo. pwd - пароль, используемый для зашифрованных файлов .

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

def getAIDlist(aidlist_to_keep,ifile,folderName): 

    archive = zipfile.ZipFile(ifile) # 
    aidlist=archive.namelist() # gets the names of all files in the zipped archive 

    print "AIDs to keep",aidlist_to_keep 

    print "Number of AIDs in the zipped archive ",len(aidlist) 

    path='/2015/MyCODE/'+folderName 

    for j in aidlist_to_keep: 
     for k in aidlist: 
      if j in k: 
       try: 
        archive.extract(k,path) 
       except: 
        print "Could Not Extract file ",(j) 
        pass 

    return 
if __name__ == '__main__': 
    getAIDlist(['9593','9458','9389'],"0009001_0010000.zip","TestingFolder") 

В идеале я хочу извлеченные файлы, которые будут сохранены в TestingFolder, но вместо этого они хранятся во вновь созданной папке 0009001_0010000.zip внутри TestingFolder ,

Как я могу направить извлеченные файлы непосредственно в TestingFolder, но без создания новой папки 0009001_0010000.zip?

+0

Я пробовал ваш код .. Для меня файлы напрямую извлекаются в TestingFolder. Нет новой папки – sailesh

+0

Действительно? Какую версию Python вы используете? Я запускаю Python 2.7.9 :: Anaconda 2.1.0 (x86_64). Я пробовал это несколько раз, но папка 0009001_0010000.zip всегда создается внутри TestingFolder. – Alex

ответ

3

Вместо использования extract() вы можете использовать ZipFile.open() и скопировать файл по своему имени; используйте shutil.copyfileobj(), чтобы эффективно скопировать данные через:

import shutil 

archive = zipfile.ZipFile(ifile) 
path = os.path.join('/2015/MyCODE', folderName) 

for name in aidlist_to_keep: 
    try: 
     archivefile = archive.open(name) 
    except KeyError: 
     # no such file in the archive 
     continue 
    with open(os.path.join(path, name), 'wb') as targetfile: 
     shutil.copyfileobj(archivefile, targetfile) 
+0

Он работает так, как я этого хотел. Большое спасибо. – Alex