Неожиданный конец данных при архивировании zip-файлов в Python - PullRequest
1 голос
/ 15 октября 2019

Добрый день.

Я написал небольшую программу на Python, которая поможет мне легко создавать файлы .cbc для Caliber, который представляет собой просто переименованный файл .zip с текстовым файлом comics.txt для целей оглавления. Каждая глава - это другой zip-файл.

Проблема в том, что в последнем заархивированном zip-файле всегда есть ошибка «Неожиданный конец данных». Сам файл не поврежден, если я разархивирую его и разархивирую, он отлично работает. Похоже, проблема в том, что Python не закрывает последний zip-файл после его заархивирования, поскольку я не могу удалить последний zip-файл, пока программа еще работает, так как она все еще открыта в Python. Само собой разумеется, что Caliber не нравится файл, и он не может конвертировать его, если я вручную не разархивирую затронутые главы.

Код выглядит следующим образом: проверка папок на наличие файлов без изображений, архивирование папок, архивированиемолнии при создании текстового файла и «изменение» расширения.


import re, glob, os, zipfile, shutil, pathlib, gzip, itertools

Folders = glob.glob("*/")
items = len(Folders)
cn_list = []
cn_list_filtered = []
dirs_filtered = []
ch_id = ["c", "Ch. "]
subdir_im = []
total = 0
Dirs = next(os.walk('.'))[1]

for i in range(0, len(Dirs)):
    for items in os.listdir("./" + Dirs[i]):
        if items.__contains__('.png') or items.__contains__('.jpg'):
            total+=1
        else:
            print(items + " not an accepted format.")
    subdir_im.append(total)
    total = 0

for fname in Folders:
    if re.search(ch_id[0] + r'\d+' + r'[\S]' + r'\d+', fname):
        cn = re.findall(ch_id[0] + "(\d+[\S]\d+)", fname)[0]
        cn_list.append(cn)
    elif re.search(ch_id[0] + r'\d+', fname):
        cn = re.findall(ch_id[0] + "(\d+)", fname)[0]
        cn_list.append(cn)
    elif re.search(ch_id[1] + r'\d+' + '[\S]' + r'\d+', fname):
        cn = re.findall(ch_id[1] + "(\d+[\S]\d+)", fname)[0]
        cn_list.append(cn)
    elif re.search(ch_id[1] + r'\d+', fname):
        cn = re.findall(ch_id[1] + "(\d+)", fname)[0]
        cn_list.append(cn)
    else:
        print('Warning: File found without proper filename format.')

cn_list_filtered = set(cn_list)
cn_list_filtered = sorted(cn_list_filtered)

cwd = os.getcwd()
Dirs = Folders
subdir_zi = []
total = 0

for i in range(0, len(cn_list_filtered)):
    for folders in Dirs:
        if folders.__contains__(ch_id[0] + cn_list_filtered[i] + " ")\
         or folders.__contains__(ch_id[1] + cn_list_filtered[i] + " "):
            print('Zipping folder ', folders)
            namezip = "Chapter " + cn_list_filtered[i] + ".zip"
            current_zip = zipfile.ZipFile(namezip, "a")
            for items in os.listdir(folders):
                if items.__contains__('.png') or items.__contains__('.jpg'):
                    current_zip.write(folders + "/" + items, items)
                    total+=1
    subdir_zi.append(total)
    total = 0

print('Folder contents in order:', subdir_im, ' Total:', sum(subdir_im))
print("Number of items per zip: ", subdir_zi, ' Total:', sum(subdir_zi))

if subdir_im == subdir_zi:
    print("All items in folders have been successfully zipped")
else:
    print("Warning: File count in folders and zips do not match. Please check the affected chapters")

zips = glob.glob("*.zip")

namezip2 = os.path.basename(os.getcwd()) + ".zip"
zipfinal = zipfile.ZipFile(namezip2, "a")

for i in range(0, len(zips), 1):
    zipfinal.write(zips[i],zips[i])

Data = []

for i in range (0,len(cn_list_filtered),1):
    Datai = ("Chapter " + cn_list_filtered[i] + ".zip" + ":Chapter " + cn_list_filtered[i] + "\r\n")
    Data.append(Datai)

Dataok = ''.join(Data)

with zipfile.ZipFile(namezip2, 'a') as myzip:
    myzip.writestr("comics.txt", Dataok)

zipfinal.close()

os.rename(namezip2, namezip2 + ".cbc")

os.system("pause")

Я ни в коем случае не программист, это просто код чудовища Франкенштейна, который мне, в конце концов, удалось собрать, проверив потоки, но эта последняя проблема поставила меня в тупик.

Некоторые решенияЯ пробовал:

for i in range(0, len(zips), 1):
    zipfinal.write(zips[i],zips[i])
    zips[i].close()

Сбой с:

zips[i].close()
AttributeError: 'str' object has no attribute 'close'

и:

for i in range(0, len(zips), 1):
    zipfinal.write(zips[i],zips[i])

zips[len(zips)].close()

Сбой с:

    zips[len(zips)].close()
IndexError: list index out of range

Спасибо запомощь.

...