Parquetizer / app.py
Eric2mangel's picture
Update app.py
a0b498c verified
import gradio as gr
import pandas as pd
import os
import tempfile
def estimate_and_convert(file, compression='snappy'):
"""
Fonction qui estime le gain et convertit le fichier en Parquet.
"""
if file is None:
return "Aucun fichier sélectionné", None
try:
# Lire le fichier selon l'extension
ext = file.name.split('.')[-1].lower()
if ext == 'csv':
df = pd.read_csv(file.name)
elif ext in ['xls', 'xlsx']:
df = pd.read_excel(file.name)
else:
return f"Type de fichier non supporté : {ext}", None
# Taille originale
size_original = os.path.getsize(file.name) / 1_000_000 # en Mo
# Créer un fichier temporaire pour le Parquet
with tempfile.NamedTemporaryFile(mode='wb', suffix='.parquet', delete=False) as tmp:
parquet_path = tmp.name
df.to_parquet(parquet_path, engine='pyarrow', compression=compression)
# Taille du fichier Parquet
size_parquet = os.path.getsize(parquet_path) / 1_000_000 # en Mo
reduction = 100 * (size_original - size_parquet) / size_original
message = (f"Taille originale : {size_original:.2f} Mo\n"
f"Taille en Parquet ({compression}) : {size_parquet:.2f} Mo\n"
f"Réduction : {reduction:.1f}%")
return message, parquet_path
except Exception as e:
return f"Erreur lors de la conversion : {str(e)}", None
# Interface Gradio
iface = gr.Interface(
fn=estimate_and_convert,
inputs=[
gr.File(label="Importer un fichier CSV ou Excel"),
gr.Dropdown(['snappy', 'gzip', 'brotli', 'zstd'], value='snappy', label="Compression")
],
outputs=[
gr.Textbox(label="Estimation du gain", lines=5),
gr.File(label="Télécharger le fichier Parquet")
],
title="Conversion CSV/Excel → Parquet",
description="Importez un fichier CSV ou Excel, la taille estimée après conversion en Parquet sera affichée et vous pourrez le télécharger."
)
iface.launch()