2013-09-02 7 views
0

Я использую ниже код для извлечения файлов, как показано ниже, но я вижу дополнительную папку, которую можно создать, может кто-нибудь, пожалуйста, помогите мне, почему создается дополнительная папка.unzip extract in python

my file is as abc.zip, который содержит файл sql.db, поэтому в идеале мне нужен файл папки как abc/sql.db, но когда я извлекаю код ниже, я получаю папку как acb/abc/sql.db, почему я получаю эту дополнительную папку, создаваемую

def unzip_artifact(local_directory, file_path): 
    fileName, ext = os.path.splitext(file_path) 
    if ext == ".zip": 
     print 'unzipping file ' + basename(fileName) + ext 
     try: 
      with zipfile.ZipFile(file_path) as zf: 
       for member in zf.infolist(): 
         # Path traversal defense copied from 
         # http://hg.python.org/cpython/file/tip/Lib/http/server.py#l789 
         words = member.filename.split('/') 
         path = local_directory 
         for word in words[:-1]: 
          drive, word = os.path.splitdrive(word) 
          head, word = os.path.split(word) 
          if word in (os.curdir, os.pardir, ''): continue 
          path = os.path.join(path, word)    
         zf.extract(member, path) 

     except zipfile.error, e: 
      print "Bad zipfile: %s" % (e) 
     return 

ответ

0

Обычно распаковка файла создаст для вас каталоги. Поэтому, если в файле .zip есть каталог abc, ваше построение пути - это то, что мешает. Попробуйте:

def unzip_artifact(local_directory, file_path): 
    fileName, ext = os.path.splitext(file_path) 
    if ext == ".zip": 
     print 'unzipping file ' + basename(fileName) + ext 
     try: 
      with zipfile.ZipFile(file_path) as zf: 
       for member in zf.infolist(): 
         # Path traversal defense copied from 
         # http://hg.python.org/cpython/file/tip/Lib/http/server.py#l789 
         zf.extract(member, local_directory) 
     except zipfile.error, e: 
      print "Bad zipfile: %s" % (e) 
     return 

Или еще лучше просто использовать extractall:

def unzip_artifact(local_directory, file_path): 
    fileName, ext = os.path.splitext(file_path) 
    if ext == ".zip": 
     print 'unzipping file ' + basename(fileName) + ext 
     try: 
      zipfile.ZipFile(file_path).extractall(local_directory) 
     except zipfile.error, e: 
      print "Bad zipfile: %s" % (e) 
     return 
+0

благодаря cforbish, который отлично работает, не могли бы вы направить меня, какие из них лучше с помощью zf.extract или извлечь все и почему, я имею дело с zip-файлами размером более 2 ГБ, поэтому просто хотелось убедиться, что он не сработает – sandeep

+0

@sandeep, если вы хотите только извлечь файлы под определенным размером, вы можете использовать первый метод и 'member.file_size' для проверки размера файла. – cforbish

+0

Спасибо Cforbish, есть способ опустить первую корневую папку полностью и извлечь с одного уровня под ним. Все мои zip-файлы содержат одну корневую папку и много папок под ней, скажем, abc.zip имеет abc/123,456,789 папки, я просто хочу, чтобы 123 456 789 папок распакованы, опустив корневую папку abc, могу ли я сделать это – sandeep