如何使用 FastAPI 上传 csv 并使用 Pandas 在内存中处理它?

时间:2021-02-03 00:54:49

标签: python fastapi

我正在尝试使用 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 内容或将其转换为 base64StringIO。我也试过codec。我在示例代码中得到的错误是

<块引用>
AttributeError: 'SpooledTemporaryFile' object has no attribute 'readable'

2 个答案:

答案 0 :(得分:2)

将编码更改为最适合您的方式,我找到了以下解决方法:

from io import StringIO
 
pd.read_csv(StringIO(str(data_file.file.read(), 'utf-16')), encoding='utf-16')

答案 1 :(得分:0)

这是一种使用库 csvcodecs 创建记录的解决方法,然后可以将其转换为 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