如何使用 FastAPI 返回 JSON 格式的 csv 文件/Pandas DataFrame?

pac*_*dev 12 python csv dataframe pandas fastapi

我有一个.csv文件想要在 FastAPI 应用程序中呈现。我只设法.csv以 JSON 格式呈现文件,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

当我尝试直接返回时pd.read_csv(csv_file_name ,sep=",").to_json(json_file_name),它起作用了,因为它返回一个字符串。

我应该如何进行?我相信这不是一个好方法。

Chr*_*ris 10

下面显示了返回存储在.csv文件/Pandas DataFrame 中的数据的四种不同方式(对于不使用 Pandas DataFrame 的解决方案,请查看此处)。有关如何有效返回大型数据帧的相关答案也可以在此处此处找到。

选项1

第一个选项是将文件数据转换JSONdict. orient您可以选择使用方法中的参数更改数据的方向.to_json()

注意:最好不要使用此选项。请参阅下面的更新

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)
Run Code Online (Sandbox Code Playgroud)
  • 更新 1:使用.to_dict()方法将是一个更好的选择,因为它会dict直接返回 a,而不是将 DataFrame 转换为 JSON(使用df.to_json()),然后将该 JSON 字符串转换为dict(使用json.loads()),如前所述。例子:

    @app.get("/questions")
    def load_questions():
        return df.to_dict(orient="records")
    
    Run Code Online (Sandbox Code Playgroud)
  • 更新 2:当使用.to_dict()方法并返回 时dict,FastAPI 在幕后自动将该返回值转换JSON为使用 Python 标准json.dumps(),先将其转换为 JSON 兼容的数据,然后使用jsonable_encoder,然后将该 JSON 兼容的数据放入a JSONResponse(有关更多详细信息,请参阅此答案)。因此,为了避免额外的处理,您仍然可以使用该.to_json()方法,但这一次,将JSON字符串放入自定义中Response并直接返回,如下所示:

    from fastapi import Response
    
    @app.get("/questions")
    def load_questions():
        return Response(df.to_json(orient="records"), media_type="application/json")
    
    Run Code Online (Sandbox Code Playgroud)

选项2

string另一种选择是使用方法以格式返回数据.to_string()

@app.get("/questions")
def load_questions():
    return df.to_string()
Run Code Online (Sandbox Code Playgroud)

选项3

HTML您还可以使用方法将数据作为表返回.to_html()

from fastapi.responses import HTMLResponse

@app.get("/questions")
def load_questions():
    return HTMLResponse(content=df.to_html(), status_code=200)
Run Code Online (Sandbox Code Playgroud)

选项4

最后,您始终可以file使用 FastAPI 的FileResponse.

from fastapi.responses import FileResponse

@app.get("/questions")
def load_questions():
    return FileResponse(path="file.csv", filename="file.csv")
Run Code Online (Sandbox Code Playgroud)