将 fastAPI POST 保存到 csv
Saving fastAPI POST to csv
我有一个发送 json 数据的气象站,我想创建一个 fastAPI 服务器来接收数据并将其保存到磁盘。目前我有
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class WeatherItem(BaseModel):
wind_direction_raw: int
rain_amount_raw: int
timestamp: list = []
elapsed_time: int
wind_speed_raw: int
message_id: int
@app.post("/station")
async def create_item(item: WeatherItem):
return item
当我使用 uvicorn main:app --host 192.168.1.151 --port 9494
启动它并使用
从 curl 发送测试数据时效果很好
curl -X POST -H "Content-Type: application/json" --data '{"elapsed_time": 6245, "timestamp": [2020, 7, 26, 12, 2, 21, 6, 208], "wind_direction_raw": 108, "wind_speed_raw": 5, "message_id": 666, "rain_amount_raw": "0"}' http://192.168.1.151:9494/station
现在我需要将这些数据保存到磁盘。我认为最简单的方法是将其附加到 csv 文件。但我不知道如何将 pydantic 模型导出到 csv。有没有一种直接的方法可以做到这一点,或者是否首选其他序列化方法?我想在 R
中分析这些数据,所以我需要它以一种相当可互换的格式存储在磁盘上。
据我所知,您有以下选择:
选项 1
像这样枚举整个条目列表,将直接值附加到 CSV 文件
with open("myFile.csv", "a") as f:
f.write(f"{model.entry},{model.another_entry}")
(这是阻塞版本)
请注意,您还可以创建一个字典并遍历值,追加它们,尽管很难保持条目之间的顺序..
选项 2
使用 pandas 将文件加载到内存中,附加到 DataFrame
然后将数据保存到文件
import pandas as pd
...
data = pd.read_csv("my_file.csv")
data_to_add = DataFrame.from_dict(my_model.dict())
data = data.append(data_to_add)
data.to_csv("my_file.csv", index=False)
@Isabi 有一个很好的答案,让我走上了正确的轨道,我已经接受了。但为了完整起见,我选择了
import csv
...
@app.post("/station")
async def create_item(item: WeatherItem):
write_path = "/home/pi/weather_station/data/weather_data_" + date.today().strftime("%Y-%m-%d") + ".csv"
with open(write_path, "a") as f:
writer = csv.writer(f)
writer.writerow(dict(item).values())
return item
我有一个发送 json 数据的气象站,我想创建一个 fastAPI 服务器来接收数据并将其保存到磁盘。目前我有
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class WeatherItem(BaseModel):
wind_direction_raw: int
rain_amount_raw: int
timestamp: list = []
elapsed_time: int
wind_speed_raw: int
message_id: int
@app.post("/station")
async def create_item(item: WeatherItem):
return item
当我使用 uvicorn main:app --host 192.168.1.151 --port 9494
启动它并使用
curl -X POST -H "Content-Type: application/json" --data '{"elapsed_time": 6245, "timestamp": [2020, 7, 26, 12, 2, 21, 6, 208], "wind_direction_raw": 108, "wind_speed_raw": 5, "message_id": 666, "rain_amount_raw": "0"}' http://192.168.1.151:9494/station
现在我需要将这些数据保存到磁盘。我认为最简单的方法是将其附加到 csv 文件。但我不知道如何将 pydantic 模型导出到 csv。有没有一种直接的方法可以做到这一点,或者是否首选其他序列化方法?我想在 R
中分析这些数据,所以我需要它以一种相当可互换的格式存储在磁盘上。
据我所知,您有以下选择:
选项 1
像这样枚举整个条目列表,将直接值附加到 CSV 文件
with open("myFile.csv", "a") as f:
f.write(f"{model.entry},{model.another_entry}")
(这是阻塞版本)
请注意,您还可以创建一个字典并遍历值,追加它们,尽管很难保持条目之间的顺序..
选项 2
使用 pandas 将文件加载到内存中,附加到 DataFrame
然后将数据保存到文件
import pandas as pd
...
data = pd.read_csv("my_file.csv")
data_to_add = DataFrame.from_dict(my_model.dict())
data = data.append(data_to_add)
data.to_csv("my_file.csv", index=False)
@Isabi 有一个很好的答案,让我走上了正确的轨道,我已经接受了。但为了完整起见,我选择了
import csv
...
@app.post("/station")
async def create_item(item: WeatherItem):
write_path = "/home/pi/weather_station/data/weather_data_" + date.today().strftime("%Y-%m-%d") + ".csv"
with open(write_path, "a") as f:
writer = csv.writer(f)
writer.writerow(dict(item).values())
return item