Zipfile模块错误:文件不是zip格式

4 投票
2 回答
18344 浏览
提问于 2025-04-16 18:17

我有这段代码:

# File: zipfile-example-1.py

import zipfile,os,glob

file = zipfile.ZipFile("Apap.zip", "w")

# list filenames
for name in glob.glob("C:\Users/*"):
    print name
    file.write(name,os.path.basename(name),zipfile.ZIP_DEFLATED)
file = zipfile.ZipFile("Apap.zip", "r")
for info in file.infolist():
    print info.filename, info.date_time, info.file_size, info.compress_size

运行这段代码时出现了这个错误:

raceback (most recent call last):
  File "C:/Users/Desktop/zip.py", line 11, in <module>
    file = zipfile.ZipFile("Apap.zip", "r")
  File "C:\Python27\lib\zipfile.py", line 712, in __init__
    self._GetContents()
  File "C:\Python27\lib\zipfile.py", line 746, in _GetContents
    self._RealGetContents()
  File "C:\Python27\lib\zipfile.py", line 761, in _RealGetContents
    raise BadZipfile, "File is not a zip file"
BadZipfile: File is not a zip file

有人知道为什么会出现这个错误吗?

2 个回答

3

比起直接写 file.close(),更好的写法是使用 with 这种上下文管理器(从 v2.7 版本开始,zipfile 就支持了),这样写起来更优雅,而且你永远不用担心忘记隐式的 close()

顺便说一下,千万不要把局部变量命名为像 file 这样的名字,因为这可能会遮盖全局变量,导致调试时出现很奇怪的行为。

所以,可以写成这样:

import zipfile,os,glob

with zipfile.ZipFile("Apap.zip", "w") as f:    
    for name in glob.glob("C:\Users/*"):
        print name
        f.write(name,os.path.basename(name),zipfile.ZIP_DEFLATED)
# `with` causes an implicit f.close() here due to its `exit()` clause

with zipfile.ZipFile("Apap.zip", "r") as f:
    for info in f.infolist():
        print info.filename, info.date_time, info.file_size, info.compress_size
7

你在第一个 for 循环后面缺少一个

file.close()

撰写回答