Ausgabe
Ich habe eine .csv
Datei, die ich in einer FastAPI-App rendern möchte. Ich habe es nur geschafft, die Datei wie folgt im JSON-Format zu rendern .csv
:
def transform_question_format(csv_file_name):
json_file_name = f"{csv_file_name[:-4]}.json"
# transforms the csv file into json file
pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name)
with open(json_file_name, "r") as f:
json_data = json.load(f)
return json_data
@app.get("/questions")
def load_questions():
question_json = transform_question_format(question_csv_filename)
return question_json
Als ich versuchte, direkt zurückzukehren pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name)
, funktioniert es, da es eine Zeichenfolge zurückgibt.
Wie soll ich vorgehen? Ich glaube, das ist nicht der richtige Weg.
Lösung
.csv
Das Folgende zeigt vier verschiedene Möglichkeiten, die in einer Datei/einem Pandas DataFrame gespeicherten Daten zurückzugeben.
Option 1
Die erste Option besteht darin, die JSON
Dateidaten in eine dict
. Optional können Sie die Ausrichtung der Daten über den orient
Parameter in der .to_json()
Methode ändern.
Hinweis: Verwenden Sie diese Option besser nicht . Siehe Updates unten.
from fastapi import FastAPI
import pandas as pd
import json
app = FastAPI()
df = pd.read_csv("file.csv")
def parse_csv(df):
res = df.to_json(orient="records")
parsed = json.loads(res)
return parsed
@app.get("/questions")
def load_questions():
return parse_csv(df)
-
Update 1 : Die Verwendung
.to_dict()
der Methode wäre eine bessere Option, da siedict
direkt a zurückgeben würde, anstatt den DataFrame in JSON (unter Verwendung vondf.to_json()
) und dann diese JSON-Zeichenfolge indict
(unter Verwendung vonjson.loads()
) zu konvertieren, wie zuvor beschrieben. Beispiel:@app.get("/questions") def load_questions(): return df.to_dict(orient="records")
-
Update 2 : Wenn Sie die
.to_dict()
Methode verwenden und die zurückgebendict
, konvertiert FastAPI hinter den Kulissen diesen Rückgabewert automatischJSON
in , indem Sie diejsonable_encoder
. Um diese zusätzliche Verarbeitung zu vermeiden, könnten Sie also immer noch.to_json()
method verwenden, aber dieses Mal fügen Sie dieJSON
Zeichenfolge in a einResponse
und geben sie direkt zurück, wie unten gezeigt.from fastapi import Response @app.get("/questions") def load_questions(): return Response(df.to_json(orient="records"), media_type="application/json")
Option 2
Eine andere Möglichkeit besteht darin, die Daten mithilfe der Methode im string
Format zurückzugeben..to_string()
@app.get("/questions")
def load_questions():
return df.to_string()
Möglichkeit 3
Sie können die Daten auch als HTML
Tabelle mit .to_html()
Methode zurückgeben.
from fastapi.responses import HTMLResponse
@app.get("/questions")
def load_questions():
return HTMLResponse(content=df.to_html(), status_code=200)
Möglichkeit 4
Schließlich können Sie die Datei immer so zurückgeben, file
wie sie ist, indem Sie FastAPIs verwenden FileResponse
.
from fastapi.responses import FileResponse
@app.get("/questions")
def load_questions():
return FileResponse(path="file.csv", filename="file.csv")
Beantwortet von – Chris
Antwort geprüft von – David Marino (FixError Volunteer)