profile_agent / utils /file_reader.py
arcshukla's picture
Upload folder using huggingface_hub
a602564 verified
Raw
History Blame Contribute Delete
2.31 kB
import os
import re
import pandas as pd
import fitz # pymupdf
from utils.logger import get_logger
logger = get_logger(__name__)
#-----------------------
# Public method
# ----------------------
def read_file(path) -> str:
path = str(path)
content = ""
if path and os.path.exists(path):
if any(x in path for x in [".txt", ".css",".js","html"]):
return _read_txt_file(path)
if ( ".pdf" in path):
return _read_pdf_file(path)
if ( ".csv" in path):
return _read_csv_file(path)
logger.error("File " + path + " not supported.")
logger.error("File " + path + " does not exists.")
return content
#-----------------------
# Internal methods
# ----------------------
def _read_csv_file(path) -> str:
df = pd.read_csv(path, on_bad_lines='skip')
if "Text" in df.columns:
content = "\n\n".join(df["Text"].dropna().astype(str))
else:
content = df.to_string(index=False)
return content
def _read_txt_file(path) -> str:
with open(path, "r", encoding="utf-8") as f:
return f.read()
def _read_pdf_file(path) -> str:
doc = fitz.open(str(path))
pages = []
for page in doc:
text = page.get_text("text") # "text" mode preserves proper spacing
if text.strip():
pages.append(text)
return "\n".join(pages)
def _fix_pdf_spacing(text: str) -> str:
lines = text.split('\n')
cleaned = []
for line in lines:
stripped = line.strip()
if not stripped:
cleaned.append('')
continue
tokens = stripped.split()
total = len(tokens)
single_char_count = sum(1 for t in tokens if len(t) == 1)
# If more than 50% of tokens are single chars → spaced-out line
if total > 2 and single_char_count / total > 0.5:
cleaned.append(''.join(tokens))
else:
# Normal line — just collapse multiple spaces to one
cleaned.append(re.sub(r' +', ' ', stripped))
result = '\n'.join(cleaned)
# Final pass: fix "word word" double-space between normal words
result = re.sub(r' +', ' ', result)
return result