Python的CSV模块在Django视图中表现不同

时间:2011-08-20 15:58:59

标签: python django csv

我有一个包含此测试内容的csv文件:

1,2,3
4,5,6
7,8,9

使用csv模块以通常的方式解析它可以正常工作:

>>> for row in csv.reader(open('test.csv')):
...     print row
... 
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']

然后我尝试在django视图中使用相同的过程:

def upload_csv(request):
    if request.method == 'POST':
        form = ProductCSVUploadForm(request.POST, request.FILES)
        if form.is_valid():
            for row in csv.reader(request.FILES['csv_file'].read()):
                print row
    else:
        form = ProductCSVUploadForm()
    return render_to_response('upload_csv.html', locals())

这给出了输出:

['1']
['', '']
['2']
['', '']
['3']
[]
['4']
['', '']
['5']
['', '']
['6']
[]
['7']
['', '']
['8']
['', '']
['9']
[]

Django是否正在更改数据?我怎样才能阻止这种情况发生?

2 个答案:

答案 0 :(得分:3)

马特补充问题的顶部:

  

发帖后,答案来了我:删除.read()。如果您愿意,请随时删除此版主。

问题的原因是read返回一个字符串,它在迭代时给出字符,而open产生一个文件对象,在迭代时产生行。

答案 1 :(得分:0)

我认为您通过阅读文件而不是仅仅将其提供给读者而犯了错误。

 for row in csv.reader(request.FILES['csv_file'].read()):

应该是:

 for row in csv.reader(request.FILES['csv_file']):