Как я могу использовать файлы, загруженные через Django, с библиотеками, которым требуется жесткий путь к файлу?Python

Программы на Python
Ответить
Anonymous
 Как я могу использовать файлы, загруженные через Django, с библиотеками, которым требуется жесткий путь к файлу?

Сообщение Anonymous »

В настоящее время я работаю над компонентом извлечения текста моего бэкэнда Django, который предназначен для извлечения текста из URL-адресов (работает), чистого текста (работает) и файлов (.pdf, .doc, .ppt, .md, .txt, .html).
Мой текущий код работает для жестко закодированных путей к файлам для допустимых входных файлов:

Код: Выделить всё

def extract_from_file(uploaded_file):

file_type = os.path.splitext(uploaded_file.name)[1].lower()

if file_type == ".pdf":
text = pdf_to_text(uploaded_file)

elif file_type in [".doc", ".docx", ".docm", ".dot", ".dotx", ".dotm"]:
text = doc_to_text(uploaded_file)

elif file_type in [".ppt", ".pptx", ".pps", ".ppsx"]:
text = ppt_to_text(uploaded_file)

elif file_type in [".md", ".html", ".htm"]:
text = html_to_text(uploaded_file, file_type)

elif file_type == ".txt":
# adapted from https://www.geeksforgeeks.org/pandas/read-html-file-in-python-using-pandas/
with open(uploaded_file, "r", encoding="utf-8") as f:
text = f.read()

else:
raise ValueError("Unsupported file type: " + file_type)

if text:
return article_from_text(text)
else:
raise ValueError("No text could be extracted from the file.")

Код: Выделить всё

def pdf_to_text(file):

reader = PdfReader(file.file)
return "".join([page.extract_text() for page in reader.pages])

def doc_to_text(file):

document = Document()
document.LoadFromFile(file)

text = document.GetText()

document.Close()

return text

def ppt_to_text(file):

presentation = Presentation()
presentation.LoadFromFile(file)

sb = []

# Loop through all slides and extract test to sb list - O(n^3) - maybe better way to do later? - quite slow
# based on https://github.com/eiceblue/Spire.Presentation-for-Python/blob/main/Python%20Examples/02_ParagraphAndText/ExtractText.py
for slide in presentation.Slides:
for shape in slide.Shapes:
if isinstance(shape, IAutoShape):
for tp in ( shape if isinstance(shape, IAutoShape) else None).TextFrame.Paragraphs:
sb.append (tp.Text)

text = "\n".join(sb)
presentation.Dispose() # Releases all resources used by presentation object

return text

def html_to_text(file, type):

with open(file, "r", encoding="utf-8") as f:
file_content = f.read()

# Convert markdown to html if needed
if type == ".md":
file_content = markdown(file_content)

# from https://gist.github.com/lorey/eb15a7f3338f959a78cc3661fbc255fe
soup = BeautifulSoup(file_content, "html.parser")
return "\n".join(soup.find_all(string=True))
В настоящее время загрузка файлов работает только для PDF-файлов, поскольку эта библиотека может обрабатывать файловый объект djangos, но Spire.docx, Spire.pptx и ручное открытие файлов html, md и txt не могут этого сделать, поскольку выдает эту ошибку:
"plum.function.NotFoundLookupError: Для функции "LoadFromFile" из spire.doc.interface.IDocument.IDocument, подпись подписи(spire.doc.Document.Document, django.core.files.uploadedfile.InMemoryUploadedFile) не удалось разрешить."
Я не хочу загружать файл локально, чтобы он работал (что я уже пробовал). Я попытался создать временный файл внутри кода, используя

Код: Выделить всё

from django.core.files.temp import NamedTemporaryFile

temp_file = NamedTemporaryFile(delete=True)
а затем использовал это для передачи temp_file.name в мои функции извлечения, но это не сработало.
Мне нигде не удалось найти что-либо по этому поводу.
Изменить:
Итак, чтобы снова попытаться использовать исправление временного файла, я смог заставить его создать этот временный файл и понять, что он существует, просто возникла проблема, которая:
  • Когда файл создан, и я настроил его на удаление временного файла при его закрытии, это означает, что его нельзя открыть снова, а затем внутри моего блока операторов '.txt' if, поскольку я получаю отказ в разрешении, поскольку он уже был открыт, и его нельзя закрыть заранее, потому что это приведет к его удалению.
  • С файлом сейчас возникла другая проблема, причину которой я не могу определить, кроме та же проблема в 1, в функциях doc_to_text или ppt_to_text, которые по какой-либо причине используют группу библиотек Spire. Объект файла и имя файла создаются следующим образом:

Код: Выделить всё

-----------------------------------------------------------------------
C:\Users\Conor\AppData\Local\Temp\tmp8qjd_5_t.docx

and still throws this error:
spire.doc.common.SpireException: IO_SharingViolation_File, C:\Users\Conor\AppData\Local\Temp\tmp8qjd_5_t.docx:   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String, FileMode, FileAccess, FileShare, FileOptions) + 0x15c
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String, FileMode, FileAccess, FileShare, FileOptions, Int64, Nullable`1) + 0x95
at System.IO.Strategies.OSFileStreamStrategy..ctor(String, FileMode, FileAccess, FileShare, FileOptions, Int64, Nullable`1) + 0x50
at Spire.Doc.Document.spra(String, FileFormat&) + 0xa3
at Spire.Doc.Document.LoadFromFile(String, FileFormat, String) + 0xcd
at Spire.Doc.AOT.NLDocument.Document_LoadFromFile(IntPtr, IntPtr, IntPtr) + 0x6d
[27/Jan/2026 17:57:21] "POST /api/analysis/ HTTP/1.1" 500 142744
Единственное решение проблемы, указанной выше, — не закрывать удаление, а вместо этого в конце всего этого сделать что-то вроде os.remove(файл), но я не хочу этого делать, поскольку кажется, что это может вызвать некоторые проблемы с безопасностью при загрузке загруженных пользователем файлов во время производства, и этот проект является частью университетского проекта, который был бы закреплен, если бы я это сделал, и это считалось бы плохой практикой.
/>Моя единственная мысль — переписать мои doc_to_text и ppt_to_text для использования какой-либо другой библиотеки или (надеюсь, не придется этого делать) создать свой собственный инструмент извлечения специально для ppt и документов.
Любые советы или идеи в этой области будут очень признательны, потому что я не могу найти других источников по этой проблеме, и я не люблю использовать ИИ по понятным причинам, лол.
Final редактировать:
Я пытался использовать файловые потоки, чтобы заставить его работать с этими библиотеками Python, но я считаю, что это невозможно, поскольку библиотеки написаны на другом языке, и ожидаю определенного типа указателя файла, который невозможно воссоздать в Python (я думаю, что это тот случай, когда я могу ошибаться)
Я создал исправление, используя python-docx и python-pptx, которые более ограничительны, но, по крайней мере, работают.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -require-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»