Из официальной документации выделен мой:
docx.Document (docx = None)
Возвращает объект Document, загруженный из docx, где docx может быть либо путь к файлу .docx (строка) или файлообразному объекту . Если docx отсутствует или отсутствует, загружается встроенный «шаблон» документа по умолчанию.
Поэтому, если вы укажете строковый или строковый параметр, он будет интерпретирован как путь к файлу docx. Чтобы предоставить содержимое из памяти, вам необходимо передать файлоподобный объект, то есть экземпляр BytesIO (весь смысл StringIO и BytesIO в том, чтобы «преобразовать» строки и байты в файловые объекты):
document = Document(io.BytesIO(decoded_data))
примечание: вы, вероятно, хотите удалить вызов .encode
в понимании списка, в Python 3 текст (str) и байты (байты) вообще не совместимы, поэтому строка будет взорвана при попытке объединить байты (кодированный текст) с текстовыми разделителями.