#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
, и, возможно, вы не можете ее поймать.