files.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import fitz
  2. import io
  3. from docx import Document
  4. from dashscope import get_tokenizer # dashscope版本 >= 1.14.0
  5. from app.service.auth import decode_access_token
  6. async def get_str_token(input_str):
  7. # 获取tokenizer对象,目前只支持通义千问系列模型
  8. tokenizer = get_tokenizer('qwen-turbo')
  9. # 将字符串切分成token并转换为token id
  10. tokens = tokenizer.encode(input_str)
  11. # print(f"经过切分后的token id为:{tokens}。")
  12. # # 经过切分后的token id为: [31935, 64559, 99320, 56007, 100629, 104795, 99788, 1773]
  13. # print(f"经过切分后共有{len(tokens)}个token")
  14. # # 经过切分后共有8个token
  15. #
  16. # # 将token id转化为字符串并打印出来
  17. # for i in range(len(tokens)):
  18. # print(f"token id为{tokens[i]}对应的字符串为:{tokenizer.decode(tokens[i])}")
  19. return len(tokens)
  20. async def read_pdf(pdf_stream):
  21. text = ""
  22. with fitz.open(stream=pdf_stream, filetype="pdf") as pdf_document:
  23. for page in pdf_document:
  24. text += page.get_text()
  25. return text
  26. async def read_word(word_stream):
  27. # 使用 python-docx 打开 Word 文件流
  28. doc = Document(io.BytesIO(word_stream))
  29. # 提取每个段落的文本
  30. text = ""
  31. for para in doc.paragraphs:
  32. text += para.text
  33. return text
  34. async def read_file(file, filename, content_type):
  35. text = ""
  36. if content_type == "application/pdf" or filename.endswith('.pdf'):
  37. # 提取 PDF 内容
  38. text = await read_pdf(file)
  39. elif content_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" or filename.endswith(
  40. '.docx'):
  41. text = await read_word(file)
  42. return await get_str_token(text)