Как избежать ошибки zipfile при сохранении файлов python -pptx - PullRequest
0 голосов
/ 14 января 2020

Я использую пакет python -pptx для создания ряда файлов .pptx из серии информационных фреймов. Все хорошо работает с добавлением слайдов и тому подобное, пока не наступит время для вызова prs.save(), где "prs" - это презентация. Это приводит к ошибке zipfile: открытые дескрипторы должны быть закрыты. Я провел некоторое исследование истории этой проблемы (с python 2.6), но не могу понять, почему это происходит здесь с Python 3.7

[Errno 95] Operation not supported
Exception ignored in: <function ZipFile.__del__ at 0x7f15f2814e18>
Traceback (most recent call last):
  File "/usr/lib/python3.7/zipfile.py", line 1789, in __del__
    self.close()
  File "/usr/lib/python3.7/zipfile.py", line 1798, in close
    raise ValueError("Can't close the ZIP file while there is "
ValueError: Can't close the ZIP file while there is an open writing handle on it. Close the writing handle before closing the zip.

Я запускаю это на кластере Databricks где я установил python -pptx из pypi, поэтому моя способность изменять базовые пакеты немного более ограничена / сложна, чем если бы я делал это на своей локальной машине.

Кроме того, я попытался

with open("new_ppt.pptx", "w") as f:
    prs = Presentation(f)

, но это выдает ошибку о том, что файл не относится к типу zip.

Что может быть опцией solid для поиска способ избежать этой ошибки при возможности создания файлов PPTX?

Спасибо!

1 Ответ

1 голос
/ 14 января 2020

Если это работает локально (что, я думаю, так и будет), но не в кластере Databricks, я бы нашел там проблему. Может быть, это файловая система не совсем то же, что обычная машина или что-то еще. Я знаю, что некоторые среды не допускают неограниченную запись файлов.

Еще одна вещь, которую вы можете попробовать, - это запись в объект BytesIO (файл "в памяти") и посмотреть, работает ли это. Я не знаю, решит ли это вашу проблему напрямую или нет, но это был бы интересный дополнительный пункт данных для рассуждения о том, что происходит.

from io import BytesIO

pptx_file = BytesIO()
prs.save(pptx_file)

# ---then maybe---
with open("deck.pptx", "wb") as f:
    f.write(pptx_file.getvalue())
...