我正在尝试使用 FastAPI 上传一个 csv 文件,然后将其加载到 Pandas 中。
import pandas as pd
import os
import io, base64
from fastapi import FastAPI, File, UploadFile, Form
app = FastAPI()
@app.post('/uploadfile/')
async def create_data_file(
experiment: str = Form(...),
file_type: str = Form(...),
file_id: str = Form(...),
data_file: UploadFile = File(...),
):
#decoded = base64.b64decode(data_file.file)
#decoded = io.StringIO(decoded.decode('utf-8'))
print(pd.read_csv(data_file.file, sep='\t'))
return {'filename': data_file.filename,
'experiment':experiment,
'file_type': file_type,
'file_id': file_id}
我尝试直接使用 file.file
内容或将其转换为 base64
或 StringIO
。我也试过codec
。我在示例代码中得到的错误是
AttributeError: 'SpooledTemporaryFile' object has no attribute 'readable'
答案 0 :(得分:2)
将编码更改为最适合您的方式,我找到了以下解决方法:
from io import StringIO
pd.read_csv(StringIO(str(data_file.file.read(), 'utf-16')), encoding='utf-16')
答案 1 :(得分:0)
这是一种使用库 csv
和 codecs
创建记录的解决方法,然后可以将其转换为 Pandas 数据框:
def to_df(file):
data = file.file
data = csv.reader(codecs.iterdecode(data,'utf-8'), delimiter='\t')
header = data.__next__()
df = pd.DataFrame(data, columns=header)
return df