SmartPaper / utils /file_parser.py
GuXiaopeng's picture
Update utils/file_parser.py
0981a11 verified
Raw History Blame
2.7 kB
# -*- coding: utf-8 -*-
import streamlit as st
from docx import Document
from config import APP_CONFIG
try:
import pandas as pd
PANDAS_AVAILABLE = True
except ImportError:
PANDAS_AVAILABLE = False
try:
import fitz # PyMuPDF 的导入名称是 fitz
PYMUPDF_AVAILABLE = True
except ImportError:
PYMUPDF_AVAILABLE = False
def extract_text_from_files(uploaded_files, max_chars=None):
if max_chars is None:
max_chars = APP_CONFIG.get("max_extract_chars", 150000)
extracted_text = ""
for file in uploaded_files:
try:
file.seek(0)
if file.name.lower().endswith('.pdf') and PYMUPDF_AVAILABLE:
# 从内存中读取文件字节流
pdf_bytes = file.read()
# 使用上下文管理器确保内存被及时释放
with fitz.open(stream=pdf_bytes, filetype="pdf") as pdf_doc:
for page in pdf_doc:
text = page.get_text()
if text:
extracted_text += text + "\n"
if len(extracted_text) > max_chars:
break
elif file.name.lower().endswith(('.docx', '.doc')):
doc = Document(file)
for para in doc.paragraphs:
extracted_text += para.text + "\n"
if len(extracted_text) > max_chars:
break
else:
content = file.getvalue().decode('utf-8', errors='ignore')
extracted_text += content + "\n"
if len(extracted_text) > max_chars:
st.warning(f"⚠️ 文件 {file.name} 已安全截断至 {max_chars} 字符。")
break
except Exception as e:
st.warning(f"⚠️ 解析失败: {e}")
finally:
file.seek(0)
return extracted_text[:max_chars]
def extract_data_from_files(uploaded_file, max_chars=20000):
if not uploaded_file:
return ""
try:
uploaded_file.seek(0)
if PANDAS_AVAILABLE:
df = pd.read_csv(uploaded_file) if uploaded_file.name.lower().endswith('.csv') else pd.read_excel(uploaded_file)
if len(df) > 100:
st.warning(f"⚠️ 数据表超长,安全截取前100行。")
df = df.head(100)
return df.to_markdown(index=False)
else:
return uploaded_file.getvalue().decode('utf-8', errors='ignore')[:max_chars]
except Exception as e:
st.warning(f"⚠️ 解析失败: {e}")
return ""
finally:
uploaded_file.seek(0)