[FIXED] Wie kann ich eine CSV-Datei/einen Pandas DataFrame im JSON-Format mit FastAPI zurückgeben?

Ausgabe

Ich habe eine .csvDatei, 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

.csvDas 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 JSONDateidaten in eine dict. Optional können Sie die Ausrichtung der Daten über den orientParameter 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 sie dictdirekt a zurückgeben würde, anstatt den DataFrame in JSON (unter Verwendung von df.to_json()) und dann diese JSON-Zeichenfolge in dict(unter Verwendung von json.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ückgeben dict, konvertiert FastAPI hinter den Kulissen diesen Rückgabewert automatischJSON in , indem Sie die jsonable_encoder. Um diese zusätzliche Verarbeitung zu vermeiden, könnten Sie also immer noch .to_json()method verwenden, aber dieses Mal fügen Sie die JSONZeichenfolge in a ein Responseund 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 stringFormat zurückzugeben..to_string()

@app.get("/questions")
def load_questions():
    return df.to_string()

Möglichkeit 3

Sie können die Daten auch als HTMLTabelle 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, filewie 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like