Django REST Framework上传CSV解析报错及数据读取咨询
解决Django REST Framework上传CSV文件读取错误
你遇到的TypeError是因为request.FILES.get('file_uploaded')返回的是InMemoryUploadedFile对象,它本身就是类文件流对象,不需要再用open()函数打开——open()需要的是文件路径字符串,而不是已经在内存中的文件对象。
下面提供两种常用的处理方式,把上传的CSV转为字典或DataFrame:
方式一:用Python内置csv模块读取为字典列表
直接将file_uploaded传入csv.DictReader,就能把CSV内容转为字典格式(表头为键,每行数据为对应值):
修改后的views.py代码:
import csv from rest_framework import viewsets from rest_framework.response import Response from .serializers import UploadSerializer class UploadViewSet(viewsets.ViewSet): serializer_class = UploadSerializer def create(self, request): file_uploaded = request.FILES.get('file_uploaded') # 直接使用InMemoryUploadedFile对象,无需open() csv_reader = csv.DictReader(file_uploaded) # 将读取结果转为字典列表 csv_data = list(csv_reader) # 示例:打印每一行字典数据 for row in csv_data: print(row) # 后续可根据业务需求处理csv_data return Response({"status": "success", "data": csv_data})
方式二:用Pandas读取为DataFrame
如果需要做复杂的数据清洗或分析,推荐用Pandas直接读取为DataFrame:
首先确保安装Pandas:
pip install pandas
修改后的views.py代码:
import pandas as pd from rest_framework import viewsets from rest_framework.response import Response from .serializers import UploadSerializer class UploadViewSet(viewsets.ViewSet): serializer_class = UploadSerializer def create(self, request): file_uploaded = request.FILES.get('file_uploaded') # 直接将文件对象传入pd.read_csv,可根据CSV编码调整encoding参数 df = pd.read_csv(file_uploaded, encoding='utf-8') # 示例:打印DataFrame前5行数据 print(df.head()) # 如需转为字典列表,使用to_dict()方法 df_dict = df.to_dict('records') return Response({"status": "success", "data": df_dict})
额外注意
- 如果上传的CSV文件过大(超过Django默认内存阈值),会自动转为
TemporaryUploadedFile(存到系统临时文件),但处理方式和InMemoryUploadedFile完全一致,无需额外修改代码。 - 若CSV出现乱码,可尝试调整
encoding参数(比如gbk、utf-8-sig)。
内容的提问来源于stack exchange,提问作者Marin Leontenko
相关产品推荐
相关产品推荐

