ZipFile' 对象没有属性 'seek'
ZipFile' object has no attribute 'seek'
我正在尝试让一个可以制作 ePub 文件的脚本正常工作。它们是压缩的 zip 文件,已放气(即未压缩)并且必须按顺序完成。此当前脚本将创建一个 .zip,但它无法使用,当 运行 zip -t
命令时,它会在 Python Shell 和终端应用程序中创建错误。
问题中的错误如下Python shell:
Traceback (most recent call last):
File "/Users/Hal/Documents/GitHub/Damore-essay-ebook/GenEpub-old.py", line 29, in <module>
if zipfile.is_zipfile(zf) is True:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 183, in is_zipfile
result = _check_zipfile(fp=filename)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 169, in _check_zipfile
if _EndRecData(fp):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 241, in _EndRecData
fpin.seek(0, 2)
AttributeError: 'ZipFile' object has no attribute 'seek'
Mac 终端上的问题错误(尽管我确信在 运行 zip -t
:
的任何地方输出都是一样的
Archive: IdealogicalEcho.epub
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of IdealogicalEcho.epub or
IdealogicalEcho.epub.zip, and cannot find IdealogicalEcho.epub.ZIP, period.
Python源代码:
#!/usr/bin/env python
#GenEpub.py - Generates an .epub file from the data provided.
#Ideally with no errors or warnings from epubcheck (needs to be implemented, maybe with the Python wrapper).
import os
import json
import zipfile
with open('metadata.json') as json_file:
data = json.load(json_file)
#The ePub standard requires deflated compression and a compression order.
zf = zipfile.ZipFile(data["fileName"] + '.epub', mode='w', compression=zipfile.ZIP_STORED)
zf.write(data["fileName"] + '/mimetype')
for dirname, subdirs, files in os.walk(data["fileName"] + '/META-INF'):
zf.write(dirname)
for filename in files:
zf.write(os.path.join(dirname, filename))
for dirname, subdirs, files in os.walk(data["fileName"] + '/EBOOK'):
zf.write(dirname)
for filename in files:
zf.write(os.path.join(dirname, filename))
#zipfile has a built-in validator for debugging
if zipfile.is_zipfile(zf) is True:
print("ZIP file is valid.")
#Extra debugging information
#print(getinfo.compress_type(zf))
#print(getinfo.compress_size(zf))
#print(getinfo.file_size(zf))
zf.close()
JSON 我使用的文件:
{
"comment1": "Metadata.json - Insert the e-book's metadata here. WIP",
"comment2": "Technical metadata - This is the where the cover image is specified. Recommended to use ePub V2.0.1 over 3.0 for epubVersion and Reflowable rather than Fixed for textPresentation (unless doing a project that requires a specific layout). mobiCover and generateKindle are currently unused but added for futureproofing.",
"epubCover": "cover.jpg",
"mobiCover": "cover.jpg",
"fileName": "IdealogicalEcho",
"epubVersion": "2.0.1",
"textPresentation": "Reflowable",
"generateKindle": "no",
"comment3": "Book metadata - Information about the e-book itself. Language is specified with ISO 639-1. Rights can be worldwide, country specific or under a permissable license such as Creative-Commons SA",
"title": "Google's Idealogical Echochamber",
"creator": "James Damore",
"subject": "Academic",
"publisher": "Hal Motley",
"ISBN": "-",
"language": "en",
"rights": "Creative-Commons SA",
"comment4": "This is the page order that the e-book has. The first number before the colon is the page order, the second is the indentation, third is the page name and fourth is file itself.",
"pages": [
{
"1": [0, "Cover", "bookcover.xhtml"],
"2": [0, "Title", "title.xhtml"],
"3": [0, "Indicia", "indicia.xhtml"],
"4": [0, "License", "license.xhtml"],
"5": [0, "Contents", "toc.xhtml"],
"6": [0, "Foreword", "foreword.xhtml"],
"7": [0, "Article", "article.xhtml"]
}
]
}
我建议您尝试在验证之前关闭。对仍处于写入状态的文件执行整个文件操作可能无法给出有效结果。
问题出在 is_zipfile
的某个地方。尽管“文件名 可能是一个文件或类似文件的对象”(13.5.1. ZipFile Objects: zipfile.is_zipfile)仍然存在,但它因 seek
错误而失败。
一个可能的解决方案是关闭文件并重新打开它只是为了检查:
zf.close()
with open(data["fileName"] + '.epub','r') as f:
if zipfile.is_zipfile(f) is True:
print("ZIP file is valid.")
我还发现该检查非常基本,并且 return True
即使您手动损坏了一些字节。真正让它失败需要一些努力。
有趣的是,明显更彻底的 zipfile.ZipFile.testzip
函数需要再次 zf
——但如果在 zf.close()
之前调用它也会失败。而且没有zf.flush()
...
幸运的是,在 运行 之后用 zip
检查创建的 ePub 文件,脚本显示它没有错误:
~/Documents $ zip -T IdealogicalEcho.epub
test of IdealogicalEcho.epub OK
(not 告诉你,顺便说一下,它是一个有效的 epub。(它不是。))
我正在尝试让一个可以制作 ePub 文件的脚本正常工作。它们是压缩的 zip 文件,已放气(即未压缩)并且必须按顺序完成。此当前脚本将创建一个 .zip,但它无法使用,当 运行 zip -t
命令时,它会在 Python Shell 和终端应用程序中创建错误。
问题中的错误如下Python shell:
Traceback (most recent call last):
File "/Users/Hal/Documents/GitHub/Damore-essay-ebook/GenEpub-old.py", line 29, in <module>
if zipfile.is_zipfile(zf) is True:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 183, in is_zipfile
result = _check_zipfile(fp=filename)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 169, in _check_zipfile
if _EndRecData(fp):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/zipfile.py", line 241, in _EndRecData
fpin.seek(0, 2)
AttributeError: 'ZipFile' object has no attribute 'seek'
Mac 终端上的问题错误(尽管我确信在 运行 zip -t
:
Archive: IdealogicalEcho.epub
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of IdealogicalEcho.epub or
IdealogicalEcho.epub.zip, and cannot find IdealogicalEcho.epub.ZIP, period.
Python源代码:
#!/usr/bin/env python
#GenEpub.py - Generates an .epub file from the data provided.
#Ideally with no errors or warnings from epubcheck (needs to be implemented, maybe with the Python wrapper).
import os
import json
import zipfile
with open('metadata.json') as json_file:
data = json.load(json_file)
#The ePub standard requires deflated compression and a compression order.
zf = zipfile.ZipFile(data["fileName"] + '.epub', mode='w', compression=zipfile.ZIP_STORED)
zf.write(data["fileName"] + '/mimetype')
for dirname, subdirs, files in os.walk(data["fileName"] + '/META-INF'):
zf.write(dirname)
for filename in files:
zf.write(os.path.join(dirname, filename))
for dirname, subdirs, files in os.walk(data["fileName"] + '/EBOOK'):
zf.write(dirname)
for filename in files:
zf.write(os.path.join(dirname, filename))
#zipfile has a built-in validator for debugging
if zipfile.is_zipfile(zf) is True:
print("ZIP file is valid.")
#Extra debugging information
#print(getinfo.compress_type(zf))
#print(getinfo.compress_size(zf))
#print(getinfo.file_size(zf))
zf.close()
JSON 我使用的文件:
{
"comment1": "Metadata.json - Insert the e-book's metadata here. WIP",
"comment2": "Technical metadata - This is the where the cover image is specified. Recommended to use ePub V2.0.1 over 3.0 for epubVersion and Reflowable rather than Fixed for textPresentation (unless doing a project that requires a specific layout). mobiCover and generateKindle are currently unused but added for futureproofing.",
"epubCover": "cover.jpg",
"mobiCover": "cover.jpg",
"fileName": "IdealogicalEcho",
"epubVersion": "2.0.1",
"textPresentation": "Reflowable",
"generateKindle": "no",
"comment3": "Book metadata - Information about the e-book itself. Language is specified with ISO 639-1. Rights can be worldwide, country specific or under a permissable license such as Creative-Commons SA",
"title": "Google's Idealogical Echochamber",
"creator": "James Damore",
"subject": "Academic",
"publisher": "Hal Motley",
"ISBN": "-",
"language": "en",
"rights": "Creative-Commons SA",
"comment4": "This is the page order that the e-book has. The first number before the colon is the page order, the second is the indentation, third is the page name and fourth is file itself.",
"pages": [
{
"1": [0, "Cover", "bookcover.xhtml"],
"2": [0, "Title", "title.xhtml"],
"3": [0, "Indicia", "indicia.xhtml"],
"4": [0, "License", "license.xhtml"],
"5": [0, "Contents", "toc.xhtml"],
"6": [0, "Foreword", "foreword.xhtml"],
"7": [0, "Article", "article.xhtml"]
}
]
}
我建议您尝试在验证之前关闭。对仍处于写入状态的文件执行整个文件操作可能无法给出有效结果。
问题出在 is_zipfile
的某个地方。尽管“文件名 可能是一个文件或类似文件的对象”(13.5.1. ZipFile Objects: zipfile.is_zipfile)仍然存在,但它因 seek
错误而失败。
一个可能的解决方案是关闭文件并重新打开它只是为了检查:
zf.close()
with open(data["fileName"] + '.epub','r') as f:
if zipfile.is_zipfile(f) is True:
print("ZIP file is valid.")
我还发现该检查非常基本,并且 return True
即使您手动损坏了一些字节。真正让它失败需要一些努力。
有趣的是,明显更彻底的 zipfile.ZipFile.testzip
函数需要再次 zf
——但如果在 zf.close()
之前调用它也会失败。而且没有zf.flush()
...
幸运的是,在 运行 之后用 zip
检查创建的 ePub 文件,脚本显示它没有错误:
~/Documents $ zip -T IdealogicalEcho.epub
test of IdealogicalEcho.epub OK
(not 告诉你,顺便说一下,它是一个有效的 epub。(它不是。))