Проблема, описанная здесь, сначала рассматривалась как будто это можно было решить, просто закрыв электронную таблицу в Excel перед запуском программы.
Однако оказывается, что закрытие Excel является необходимым, но недостаточным условием. Проблема все еще возникает, но не на каждой машине Windows и не каждый раз (иногда это происходит после одного выполнения, иногда после двух).
Я изменил программу так, что теперь она читает из одной электронной таблицы и записывает в другую, но проблема остается. Я даже продолжаю программно уничтожать все устаревшие процессы Python перед запуском программы. По-прежнему никакой радости.
Функция openpyxl
save()
создает экземпляр ZipFile
таким образом:
archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
... с Zipfile
, затем используя это, чтобы попытаться открыть файл в режиме 'wb'
, таким образом:
if isinstance(file, basestring):
self._filePassed = 0
self.filename = file
modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
try:
self.fp = open(file, modeDict[mode])
except IOError:
if mode == 'a':
mode = key = 'w'
self.fp = open(file, modeDict[mode])
else:
raise
Согласно документам:
В Windows добавление «b» к режиму открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Эта негласная модификация файловых данных подходит для текстовых файлов ASCII, но приведет к повреждению двоичных данных, как в файлах JPEG или EXE. Будьте очень осторожны при чтении и записи таких файлов в двоичном режиме. В Unix не помешает добавить к режиму букву «b», так что вы можете использовать его независимо от платформы для всех двоичных файлов.
... что объясняет, почему необходимо использовать режим 'wb'.
Есть ли что-то в открытии файла Python, которое могло бы оставить файл в некотором состоянии «открытости»?
Windows: 8
Python: 2.7.10
openpyxl: последняя версия
self.fp.close()
в конце операции? - person Radosław Roszkowiak   schedule 22.07.2015ZipFile
, части стандартной библиотеки Python. Я бы предпочел не трогать его. - person Pyderman   schedule 22.07.2015with
. - person Alyssa Haroldsen   schedule 22.07.2015openpyxl
save
действительно закрывает файл. - person Pyderman   schedule 22.07.2015