Django:上传文件是二进制的,可以改为utf吗?这样readline()返回的是unicode而不是字节
在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')