Zip 文件的 Python 问题

标签 python jar zip

免责声明:编码新手

C:\Python27\python.exe C:/Users/Evolution/PycharmProjects/MCMODVERSION/stuff/main.py
<open file 'C:\\Users\\Evolution\\Desktop\\mods\\AT_StalkerCreepers_1.6.4.jar', mode 'r' at 0x026F6A18>
Traceback (most recent call last):
True
<zipfile.ZipFile object at 0x02736EB0>
  File "C:/Users/Evolution/PycharmProjects/MCMODVERSION/stuff/main.py", line 80, in <module>
<open file 'C:\\Users\\Evolution\\Desktop\\mods\\BC_AdditionalPipes2.6.0-BC4.2.1.jar', mode 'r' at 0x026F6AC8>
    o = t.getdirList()
True
  File "C:/Users/Evolution/PycharmProjects/MCMODVERSION/stuff/main.py", line 36, in getdirList
    self.getModinfo(os.path.join(p, o[n]), 'name')
  File "C:/Users/Evolution/PycharmProjects/MCMODVERSION/stuff/main.py", line 46, in getModinfo
    y = zipfile.ZipFile(x)
  File "C:\Python27\lib\zipfile.py", line 766, in __init__
    self._RealGetContents()
  File "C:\Python27\lib\zipfile.py", line 832, in _RealGetContents
    raise BadZipfile("Truncated central directory")
zipfile.BadZipfile: Truncated central directory

Process finished with exit code 1

正在执行的代码:

def getdirList(self):
    p = 'C:\Users\Evolution\Desktop\mods'
    o = [f for f in listdir(p) if isfile(join(p, f))]
    for mod in range(len(o)):
        print o[mod]
        self.getModinfo(os.path.join(p, o[mod]), 'name')


def getModinfo(self,mod,type):
    """ Types:
    modid, name, description, version, mcversion, url
    updateurl, authors, credits, dependencies """
    x = file(mod)
    print x
    print zipfile.is_zipfile(x)
    y = zipfile.ZipFile(x)
    print y

修正代码:

def getdirList(self):
    p = r'C:\Users\Evolution\Desktop\mods'
    o = [f for f in listdir(p) if isfile(join(p, f))]
    for mod in range(len(o)):
        print o[mod]
        self.getModinfo(os.path.join(p, o[mod]), 'name')

def getModinfo(self,mod,type):
    """ Types: modid, name, description, version, mcversion, 
    url, updateurl, authors, credits, dependencies """
    try:
        x = open(mod, 'rb')
        y = zipfile.ZipFile(x)
        z = y.read(self.minfo)
        #print z
        #zz = self.parseIt(z, '%s": ' % type, ',')
        #print zz
    except KeyError:
        print "ERROR: %s has no %s file!" % (x, self.minfo)
        print "%s" % "-" * 50
    x.close()

现在我运行检查,如您所见,该 zip 文件实际上是一个 zip 文件。超过一半的文件会抛出此异常。 .jar 和 .zip

是的,我已经手动打开了它们,它们没有损坏或被锁定或其他任何东西。有什么我可以做的或者我可以用来在 python 中操作 achrives 的另一个库吗?

谢谢。

最佳答案

Zip 文件是二进制文件。要正确处理二进制文件,您应该使用二进制模式打开文件。

替换以下行:

x = file(mod)

与:

x = file(mod, 'rb')

顺便说一句,在目录路径中转义 \,或者使用原始字符串文字。 (这不是问题的直接原因,但总有一天转义序列会麻烦你)

'C:\\Users\\Evolution\\Desktop\\mods' # escape

r'C:\Users\Evolution\Desktop\mods'    # raw string literal (`r` prefix)

关于Zip 文件的 Python 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22155594/

相关文章:

python - VSCode/Pylint 在同一目录中找不到模块

python - 亚马逊 Alexa 技能无法正确运行正在运行的 Python 代码

java - Python 服务器没有从 Java 客户端接收到完整的字符串

php - ZIP 文件被 IE 损坏

python - 相当于golang中的itemgetter

java - Scala 和 Kotlin 的手动 JAR 编译

java - 将小程序添加到网站

java - 如何在不运行的情况下将测试类打包到jar中?

c++ - 有没有关于如何将包含文件夹和文件的 zip 文件解压缩到某个目录并通过 MiniZip 将它们打包回来的教程?

python - 如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘