Ошибка модуля Zipfile: файл не является zip-файлом

#python

#python

Вопрос:

У меня есть этот код:

 # 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:Python27libzipfile.py", line 712, in __init__
    self._GetContents()
  File "C:Python27libzipfile.py", line 746, in _GetContents
    self._RealGetContents()
  File "C:Python27libzipfile.py", line 761, in _RealGetContents
    raise BadZipfile, "File is not a zip file"
BadZipfile: File is not a zip file
  

Кто-нибудь знает, почему возникает эта ошибка?

Комментарии:

1. Откат последнего редактирования, потому что кто-то отредактировал весь вопрос и заменил его ответом.

Ответ №1:

Вам не хватает

 file.close()
  

после первого for цикла.

Комментарии:

1. Лучше использовать стиль Pythonic with (обработчик контекста).

Ответ №2:

Лучшим стилем, чем явный, file.close() является использование with обработчика контекста в стиле (поддерживается zipfile начиная с версии v2.7), что создает гораздо более элегантную идиому, где вы никогда не сможете забыть неявный 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