将Django文件上传对象传递给Python CSV模块的意外结果
我在上传文件时没有问题,如果把文件保存到磁盘上,所有的格式都保持得很好。
我写了一个函数来读取这个文件,使用的是:
data = csv.reader(f.read())
这里的 f 是我从 'form.cleaned_data['file']' 中得到的 Django 文件对象,没错,这个文件已经和表单绑定了。
但是当我尝试用下面的方式读取文件时:
for row in data:
logging.debug(row)
我得到的结果有点意外,似乎是把数据分成了小块,就好像在读取某个缓冲区。例如,对于我的浮点字段,当我记录每一行时,得到的是:
['0'] ['.'] ['0'] ['5'] ['', ''] ['0'] ['.'] ['2'] 等等……每个方括号中的内容实际上都是来自同一行(也就是换行符)。
csv.reader 要求它接收的对象支持迭代器协议,而我相信 Django 文件对象 是支持的。
那我到底哪里出错了呢?
2 个回答
0
如果你试着把整个文件读进来,记录下它的前几个字节,然后再把它传给解析器,会发生什么呢?也许文件的上传方式跟你想的不一样?可能是http表单编码的问题?
1
你实际上传给 csv.reader()
的是错误的可迭代对象。试着把那一行改成:
data = csv.reader(f)
你现在做的是把整个文件的内容都传给了 csv.reader()
函数,这样它就会逐个字符地读取,把每个字符都当成一行来处理。如果你把实际的文件对象传给这个函数,它就会按照你预期的那样逐行读取文件。