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 的解决方案,请查看此处)。有关如何有效返回大型数据帧的相关答案也可以在此处和此处找到。
第一个选项是将文件数据转换JSON为dict. 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)
string另一种选择是使用方法以格式返回数据.to_string()。
@app.get("/questions")
def load_questions():
return df.to_string()
Run Code Online (Sandbox Code Playgroud)
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)
最后,您始终可以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)
| 归档时间: |
|
| 查看次数: |
13744 次 |
| 最近记录: |