'how to render a json from a dataframe in fastAPI
I have a csv file that i want to render in a fastAPI app. I only managed to render te csv in json format like following:
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
When i tried directly pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name) in return it does work as it returns a string.
How should I proceed ? I believe this is not the good way to do it.
Solution 1:[1]
The below shows four different ways to return the data from a csv file.
Option 1 is to convert the file data into JSON and then parse it into a dict. You can optionally change the orientation of the data using the orient parameter in the to_json() method.
- Update 1: Using
to_dict()method might be a better option, as there is no need for parsing theJSONstring. - Update 2: When using
to_dict()method and returning thedict, FastAPI, behind the scenes, automatically converts that return value intoJSON, using thejsonable_encoder. Thus, to avoid that extra work, you could still useto_json()method, but instead of parsing theJSONstring, put it in aResponseand return it directly, as shown in the example below.
Option 2 is to return the data in string format, using to_string() method.
Option 3 is to return the data as an HTML table, using to_html() method.
Option 4 is to return the file as is using FastAPI's FileResponse.
from fastapi import FastAPI, Response
from fastapi.responses import FileResponse
from fastapi.responses import HTMLResponse
import pandas as pd
import json
df = pd.read_csv("file.csv")
app = FastAPI()
def parse_csv(df):
res = df.to_json(orient="records")
parsed = json.loads(res)
return parsed
@app.get("/questions")
def load_questions():
return Response(df.to_json(orient="records"), media_type="application/json") # Option 1 (Updated 2): Return as JSON directly
#return df.to_dict(orient="records") # Option 1 (Updated 1): Return as dict (encoded to JSON behind the scenes)
#return parse_csv(df) # Option 1: Parse the JSON string and return as dict (encoded to JSON behind the scenes)
#return df.to_string() # Option 2: Return as string
#return HTMLResponse(content=df.to_html(), status_code=200) # Option 3: Return as HTML Table
#return FileResponse(path="file.csv", filename="file.csv") # Option 4: Return as File
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
