import gradio as gr import pandas as pd import requests from io import BytesIO def convert_file(input_file, file_url, conversion_type): # 파일 업로드와 URL 입력 둘 다 없으면 에러 발생 if input_file is None and (file_url is None or file_url.strip() == ""): raise ValueError("파일 업로드 또는 URL을 제공하세요.") df = None # 업로드된 파일이 없으면 URL에서 읽기 if input_file is None: file_url = file_url.strip() # URL 스킴이 없으면 기본적으로 "https://"를 추가 if not file_url.lower().startswith(("http://", "https://")): file_url = "https://" + file_url response = requests.get(file_url) response.raise_for_status() if conversion_type == "CSV to Parquet": df = pd.read_csv(BytesIO(response.content)) else: # Parquet to CSV df = pd.read_parquet(BytesIO(response.content)) else: # 파일 업로드가 있는 경우 file_path = input_file.name if conversion_type == "CSV to Parquet": df = pd.read_csv(file_path) else: df = pd.read_parquet(file_path) # 변환 실행: CSV to Parquet 혹은 Parquet to CSV if conversion_type == "CSV to Parquet": output_file = "output.parquet" df.to_parquet(output_file, index=False) else: output_file = "output.csv" df.to_csv(output_file, index=False) # 상위 10줄 미리보기 생성 preview = df.head(10).to_string(index=False) return output_file, preview demo = gr.Interface( fn=convert_file, inputs=[ gr.File(label="입력 파일 (CSV 또는 Parquet)"), gr.Textbox(label="입력 파일 URL (선택)", placeholder="CSV 또는 Parquet 파일의 URL을 입력하세요."), gr.Radio(choices=["CSV to Parquet", "Parquet to CSV"], label="변환 유형") ], outputs=[ gr.File(label="변환된 파일"), gr.Textbox(label="미리보기 (상위 10줄)") ], title="CSV <-> Parquet 변환기", description="변환 유형을 선택하고, 파일을 업로드하거나 URL을 입력하여 CSV와 Parquet 파일을 상호 변환합니다. 상위 10줄 미리보기도 제공합니다." ) if __name__ == "__main__": demo.launch()