首页 > 解决方案 > 在 Python 中压缩 zip 文件时数据意外结束

问题描述

再会。

我编写了一个小 Python 程序来帮助我轻松地为 Calibre 创建 .cbc 文件,它只是一个重命名的 .zip 文件,其中包含一个名为 Comics.txt 的文本文件,用于 TOC。每章都是另一个 zip 文件。

问题是最后压缩的 zip 文件总是有错误“数据意外结束”。文件本身没有损坏,如果我解压缩并重新压缩它,它可以完美运行。玩弄它似乎问题在于Python在压缩后不会关闭最后一个zip文件,因为我无法在程序仍在运行时删除最后一个zip,因为它仍然在Python中打开。不用说,Calibre 不喜欢该文件并且无法转换它,除非我手动重新压缩受影响的章节。

代码如下,检查文件夹中的非图像文件,压缩文件夹,在创建文本文件时压缩 zip,以及“更改”扩展名。


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

谢谢您的帮助。

标签: pythonzipcalibre

解决方案


推荐阅读