본문 바로가기

안녕하세요!

프로그래밍 언어/Python

[ Python ] Open WebUI 커스터마이징 - csv 파일(3)

 

 

rows_to_markdown_temp


 

def rows_to_markdown_temp(rows, base_name, folder):
    """CSV 업로드가 400이면 Markdown 표로 우회"""
    md_headers = ["id", "이름", "성별", "나이", "desc"]
    lines = ["| " + " | ".join(md_headers) + " |",
             "| " + " | ".join(["---"] * len(md_headers)) + " |"]
    for r in rows:
        vals = [str(r.get(k, "")) for k in md_headers]
        lines.append("| " + " | ".join(vals) + " |")
    md_text = "\n".join(lines)

    base_no_ext = os.path.splitext(base_name)[0] or "upload"
    out_name = f"{base_no_ext}.md"
    data_dir = os.path.join(os.path.dirname(WATCH_DIR), "data")
    out_dir = data_dir if os.path.isdir(data_dir) else os.path.dirname(WATCH_DIR)
    out_path = os.path.join(out_dir, f"__prepared__{out_name}")
    with open(out_path, "w", encoding="utf-8") as f:
        f.write(md_text)
    return out_path, "text/markdown;charset=utf-8", out_name

 

md_headers = ["id", "이름", "성별", "나이", "desc"]
  - 마크다운 표의 headr를 고정으로 정의
  - 원본 CSV에 다른 칼럼이 있어도 여기서는 이 5개만 쓰도록 고정
  - add_desc에서 붙인 desc 칼럼을 보여주려는 의도

["---"] * len(md_headers)
  - 마크다운 표에서 헤더와 본문 구분하는 구분선 역할

base_no_ext
  - os.path.splitext(base_name)[0] : base_name에서 확장자 제거
  - "upload" : 확장자가 없으면 upload로 대체
  - 확장자가 두 개면 맨 마지막 확장자만 제거

out_name
  - f"{base_no_ext}.md" : 업로드용 표시 이름은 .md 확장자

 

prepare_for_upload


 

def prepare_for_upload(file_path: str, send_name: str):
    lower = file_path.lower()
    folder = os.path.dirname(file_path)

    # CSV
    if lower.endswith(".csv"):
        headers, rows = read_csv_rows(file_path)
        headers, rows = add_desc(headers, rows)
        pth, mim, nm = write_temp_csv_with_desc(rows, headers, send_name, folder)
        return pth, mim, nm, rows

    # XLSX/XLS
    if lower.endswith((".xlsx", ".xls")):
        headers, rows = read_xlsx_rows(file_path)
        headers, rows = add_desc(headers, rows)
        pth, mim, nm = write_temp_csv_with_desc(rows, headers, send_name, folder)
        return pth, mim, nm, rows

    # 전처리 없음
    return None, None, None, None

 

file_path
  - whtche.py가 감지한 원본 파일의 절대 경로

send_name
  - 업로드 시 사용할 안전한 파일명, 보통 ascii_safe_filename(...) 결과가 들어와서 non-ASCII가 제거된 상태

read_csv_rows(file_path)
  - CSV를 utf-8-sig > utf-8 > cp949 순으로 읽어 headers, rows를 얻음

add_desc(headers, rows)
  - 각 행에 desc 칼럼을 만들어 붙이고, header에 desc가 없으면 추가

write_temp_csv_with_desc(...)
  - __prepared__..._with_desc.csv라는 임시 CSV를 같은 폴더에 생성

read_xlsx_rows(file_path)
  - 첫 shet를 읽어 headers, rows 구성, 계산식은 data_only=True로 읽음

write_temp_csv_with_desc(...)
  - 엑셀을 CSV로 변환 + desc 포함

(None, None, None, None)
  - 그 외의 확장자는 전처리 하지 않고  None으로 반환




loading