将Django文件上传对象传递给Python CSV模块的意外结果

0 投票
2 回答
1310 浏览
提问于 2025-04-15 14:10

我在上传文件时没有问题,如果把文件保存到磁盘上,所有的格式都保持得很好。

我写了一个函数来读取这个文件,使用的是:

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() 函数,这样它就会逐个字符地读取,把每个字符都当成一行来处理。如果你把实际的文件对象传给这个函数,它就会按照你预期的那样逐行读取文件。

撰写回答