Python docx - AttributeError: у объекта 'bytes' нет атрибута 'seek' - PullRequest
0 голосов
/ 06 февраля 2020

Что я имею в качестве входных данных: необработанные байты документа docx в формате byte64.
Чего я пытаюсь достичь: извлекать текст из этого документа для дальнейшей обработки.
Я пытался следовать этому ответу: извлечение текст из файлов MS Word в python

Мой фрагмент кода:

base64_bytes = input.encode('utf-8')
decoded_data = base64.decodebytes(base64_bytes)
document = Document(decoded_data)
docText = '\n\n'.join([paragraph.text.encode('utf-8') for paragraph in document.paragraphs])

В строке document = Document(decoded_data) выдается следующая ошибка: AttributeError: 'bytes' object has no attribute 'seek'
The decoded_data имеет следующий формат: b'PK\\x03\\x04\\x14\\x00\\x08\\x08\\x08\\x00\\x87@CP\\x00...

Как мне отформатировать необработанные данные для извлечения текста из docx?

1 Ответ

1 голос
/ 06 февраля 2020

Из официальной документации выделен мой:

docx.Document (docx = None)

Возвращает объект Document, загруженный из docx, где docx может быть либо путь к файлу .docx (строка) или файлообразному объекту . Если docx отсутствует или отсутствует, загружается встроенный «шаблон» документа по умолчанию.

Поэтому, если вы укажете строковый или строковый параметр, он будет интерпретирован как путь к файлу docx. Чтобы предоставить содержимое из памяти, вам необходимо передать файлоподобный объект, то есть экземпляр BytesIO (весь смысл StringIO и BytesIO в том, чтобы «преобразовать» строки и байты в файловые объекты):

document = Document(io.BytesIO(decoded_data))

примечание: вы, вероятно, хотите удалить вызов .encode в понимании списка, в Python 3 текст (str) и байты (байты) вообще не совместимы, поэтому строка будет взорвана при попытке объединить байты (кодированный текст) с текстовыми разделителями.

...