Django:上传文件是二进制的,可以改为utf吗?这样readline()返回的是unicode而不是字节

2 投票
1 回答
2549 浏览
提问于 2025-05-01 10:21

在Django(1.7)中使用Python 3上传文件:

f = form.files['file']
f.__repr__()

输出结果

<InMemoryUploadedFile: index.html (text/html)>

如果我调用 f.readline(),我得到的是字节数据。通常这没问题,我可以直接读取文件并进行解码,但在这种情况下,我把文件传递给另一个函数,而这个函数期望接收到的参数可以调用 readline(),而 readline() 需要返回的是Unicode字符串,而不是字节。

有没有办法在 InMemoryUploadedFile 的实例上设置编码,这样 readline() 就能返回Unicode而不是字节?还是说我必须先使用 StringIO 读取整个文件,然后再把 StringIO 的实例传递给我的函数?

暂无标签

1 个回答

8

处理这个问题的一般方法可能是编写一个自定义的上传处理器,然后告诉Django使用它。不过我自己从来没有做过这个,所以不太确定。

但一个简单的方法就是直接包装底层的文件对象。(如果你使用TextIOWrapper而不是StringIO,你就不需要担心额外的开销。)

from io import TextIOWrapper

f = form.files['file']
text_f = TextIOWrapper(f.file, encoding='utf-8')

撰写回答