Zip-файл Python попробуйте, кроме как не передавать «zlib.error: ошибка -3 при распаковке данных: недопустимое расстояние слишком далеко назад»

#python #error-handling #unzip #zipfile #try-except

#python #обработка ошибок #распаковать #попробуйте-за исключением #python-zipfile

Вопрос:

Я работаю над скриптом python для распаковки папки с вложенными ZIP-файлами. В общем, кажется, что это работает, но когда дело доходит до одного из файлов, я всегда получаю эту ошибку:

 zlib.error: Error -3 while decompressing data: invalid distance too far back
 

Сначала я пытался использовать try и except , чтобы передать это, но это не сработало. Затем я попытался добавить в предложение except except zipfile.BadZipFile после прочтения различных сообщений об этом здесь, но я все еще получаю ту же ошибку. Вот как выглядит мой код:

 import os
import zipfile
folder_path = [MY FOLDER PATH HERE]

def extract_zip(filepath_in, filepath_out, password):
    if is_zip(filepath_in):
        print(filepath_in)
        with zipfile.ZipFile(filepath_in, 'r') as zip_file:
            zip_file.extractall(filepath_out, pwd = bytes(password, 'utf-8'))

error_list = []
zip_count = 1           
while zip_count > 0:   
    filelist = []

    for root, dirs, files in os.walk(folder_path):      
        for file in files:
            filelist.append(os.path.join(root,file)) 
       
    zip_count = 0   
    for name in filelist:
        if name[(len(name) - 4):(len(name))] == ".zip":      #if file name ends in .zip
            zip_count =  1
            try:    
                extract_zip(name, name[0:(len(name) - 4)] , password)
                os.remove(name)    
            except zipfile.BadZipFile as fail:
                error_list.append(name), fail
                pass

 

Я не уверен, как еще можно либо проигнорировать ошибку, либо есть какой-то другой способ извлечь файл.

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопрос (не комментарий) в виде текста (не скриншота). Есть и другая полезная информация.

2. в python вам не нужно использовать len(name)-4 , но вы можете использовать напрямую -4 , как name[0:-4] или даже короче name[:-4] и похожее name[-4:] вместо name[(len(name) - 4):(len(name))] . Но вам это не нужно — используйте if name.endswith(".zip") . В конечном итоге используйте glob.glob("*.zip") вместо os.walk()

3. это может быть ошибка непосредственно в библиотеке C / C zlib , и, возможно, вы не можете ее поймать.