import os import requests import tempfile import pandas as pd import PyPDF2 from tools.interfaces.interface_file_reader import FileReaderInterface class HuggingFaceFileReader(FileReaderInterface): def __init__(self, huggingface_token: str, base_url: str,is_local=False): self.huggingface_token = huggingface_token self.base_url = base_url self.is_local=is_local def read(self, file_path: str) -> str: try: # Si le fichier est local, on lit directement if self.is_local: if os.path.isfile(file_path): return self._read_local(file_path) # Sinon, on considère que c'est un fichier distant full_url = self.base_url + file_path headers = {"Authorization": f"Bearer {self.huggingface_token}"} if file_path.lower().endswith(".txt") or file_path.lower().endswith(".pdf"): # Télécharger et lire localement with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file_path)[-1]) as tmp_file: response = requests.get(full_url, headers=headers) response.raise_for_status() tmp_file.write(response.content) tmp_path = tmp_file.name content = self._read_local(tmp_path) os.remove(tmp_path) return content elif file_path.lower().endswith(".csv"): response = requests.get(full_url, headers=headers) response.raise_for_status() df = pd.read_csv(pd.compat.StringIO(response.text)) return df.to_string(index=False) elif file_path.lower().endswith((".xls", ".xlsx")): response = requests.get(full_url, headers=headers) response.raise_for_status() with tempfile.NamedTemporaryFile(suffix=".xlsx") as tmp: tmp.write(response.content) tmp.flush() df = pd.read_excel(tmp.name) return df.to_string(index=False) else: return "Format de fichier non supporté. Utilise .txt, .csv, .xlsx ou .pdf" except Exception as e: return f"Erreur lors de la lecture du fichier : {e}" def _read_local(self, path: str) -> str: if path.lower().endswith(".txt"): with open(path, "r", encoding="utf-8") as f: return f.read() elif path.lower().endswith(".pdf"): text = "" with open(path, "rb") as f: reader = PyPDF2.PdfReader(f) for page in reader.pages: text += page.extract_text() or "" return text if text.strip() else "Aucun texte lisible extrait du PDF." else: return "Format local non supporté pour cette méthode."