Python 如何使用FastAPI上传csv,并使用Pandas在内存中进行处理?

Python 如何使用FastAPI上传csv,并使用Pandas在内存中进行处理?,python,fastapi,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(...),

我正在尝试用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
。我在示例代码中遇到的错误是


这是一种使用库
csv
codecs
创建记录的变通方法,这些记录可以转换为数据帧:

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

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

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

您不想将文件保存为csv吗。我想把它转换成拼花地板。我想看看失败的文件的例子。上面的方法对我有效。(唯一的区别是我的测试文件不是以制表符分隔的)
from io import StringIO
 
pd.read_csv(StringIO(str(data_file.file.read(), 'utf-16')), encoding='utf-16')