#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