在我的django应用程序中,我提供了一个允许用户上传文件的表单.该文件可以采用多种格式(Excel,CSV),来自各种平台(Mac,Linux,Windows),并以各种编码(ASCII,UTF-8)编码.
出于这个问题的目的,让我们假设我有一个正在接收的视图request.FILES['file'],这是一个InMemoryUploadedFile被调用的实例file.我的问题是InMemoryUploadedFile对象(如file):
\xef\xbb\xbf在文件的开头看到一个,据我所知是一个标志,意思是'这个文件是UTF-8').使问题复杂化的是我希望将文件传递给python csv模块,该模块本身不支持Unicode.我很乐意接受避免这个问题的答案 - 一旦我让django玩UTF-8,我相信我可以大胆csv地做同样的事情.(同样,请忽略支持Excel的要求 - 在解决Excel文件之前,我要等到CSV工作.)
我已经尝试使用StringIO,mmap,codec,和任何的各种各样的在访问数据的方法InMemoryUploadedFile的对象.每种方法都产生了不同的错误,到目前为止还没有一种是完美的.这显示了一些我认为最接近的代码:
import csv
import codecs
class CSVParser:
def __init__(self,file):
# 'file' is assumed to be an InMemoryUploadedFile object.
dialect = csv.Sniffer().sniff(codecs.EncodedFile(file,"utf-8").read(1024))
file.open() # seek to 0
self.reader = csv.reader(codecs.EncodedFile(file,"utf-8"),
dialect=dialect)
try:
self.field_names = self.reader.next()
except StopIteration:
# The file was empty - this is not allowed.
raise …Run Code Online (Sandbox Code Playgroud)