Django REST Framework读取CSV报错:迭代器应返回字符串而非字节
Django REST Framework读取CSV文件报错解决方法
问题描述
在Django REST Framework中读取上传的CSV文件时,触发如下报错:
_csv.Error: iterator should return strings, not bytes (the file should be opened in text mode)
原读取代码如下:
csv_file = request.FILES["Bus"] data = [] with csv_file.open('r') as file: reader = csv.DictReader(file) for r in reader: print(r)
问题原因
request.FILES获取的文件对象默认是二进制模式,即便调用open('r'),也无法将其转换为csv.DictReader所需的标准文本模式迭代器,因此抛出字节/字符串不匹配的错误。
解决方案
方法一:用io.TextIOWrapper包装二进制流
直接将上传文件的二进制流包装为文本模式对象,指定对应编码:
import csv import io csv_file = request.FILES["Bus"] data = [] # 转换为文本模式流,编码需与CSV文件实际编码匹配 text_stream = io.TextIOWrapper(csv_file.file, encoding='utf-8') with text_stream as file: reader = csv.DictReader(file) for row in reader: print(row) data.append(row)
方法二:读取字节内容后转为字符串流
先读取二进制内容并解码为字符串,再用StringIO模拟文本文件:
import csv from io import StringIO csv_file = request.FILES["Bus"] data = [] # 读取二进制内容并解码,编码需与CSV文件一致 file_content = csv_file.read().decode('utf-8') # 转为StringIO供csv.DictReader处理 string_stream = StringIO(file_content) reader = csv.DictReader(string_stream) for row in reader: print(row) data.append(row)
注意事项
- 必须确保指定的编码与CSV文件实际编码一致,常见编码包括
utf-8、gbk、gb2312,编码不匹配会导致乱码或解码失败。 - 如果CSV文件带UTF-8 BOM头,可将编码参数改为
utf-8-sig自动去除BOM。
内容的提问来源于stack exchange,提问作者ClawX69
相关产品推荐
相关产品推荐

