Zipfile模块错误:文件不是zip文件。

4

我有这段代码:

# 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

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


回滚了最近的编辑,因为有人将整个问题都编辑删除并替换为答案。 - Dhara
2个回答

7
您缺少一个
file.close()

在第一个for循环之后。

1
更好的Pythonic风格是使用with(上下文管理器)。 - smci

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接