使用Django和csv.DictReader解析CSV

时间:2013-07-29 16:59:37

标签: python django parsing csv

我有一个包含许多字段的Django模型(大约24个),显然我的用户希望能够使用电子表格上传创建此对象的实例,而不是手动将所有数据输入表单。

我发现使用python的内置CSV模块应该会让这个变得相当简单,但是我很难弄清楚如何使用它。

让我们从代码方面开始:

def upload_file(request):

  if request.method == "POST":
    form = UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
      handle_files(request.FILES['file'])
      return HttpResponseRedirect('/workflow/')
    else:
      print form.errors
      print request.FILES
      return HttpResponseRedirect('/workflow/upload')
  else:
    form = UploadFileForm()
    return render(request, 'fileform.html', {'formset': form})

这接受CSV文件作为上传,并将其交给handle_files以处理解析和对象创建。这是我遇到麻烦的方法。

def handle_files(f):
    reader = csv.DictReader(f, delimiter=' ', quotechar='|')
    ... #?

我一直在尝试模仿python文档(http://docs.python.org/2/library/csv.html),但是DictReader的文档很少。我是否提供csv.DictReader()适当的论据?如果有,我怎样才能从reader中获取信息?我将为用户提供模板,因此我可以假设CSV文件的每一列都有可预测的数据。也就是说,我知道列A将具有与字段X对应的数据,而列B对应于Y等。如何从读取器解析数据,然后使用该数据创建对象?

我猜它会是这样的:

for row in reader:
    X=row[1]
    Y=row[2]
    #etc
    my_object = MyObject(x=X, y=Y)
    my_object.save()

这样离开了吗?我应该使用其他类型的CSV阅读器吗?

感谢您的帮助,我知道这篇文章中有很多问题。

2 个答案:

答案 0 :(得分:4)

我刚刚开始使用Django,但我之前使用过python csv库。当我使用它时,我只需执行以下操作:

import csv
...
reader = csv.reader(f)
for row in reader:
    #do something with each row
f.close()

所以你非常接近。此外,索引从0开始,因此如果您想要第一个元素,请使用row[0]

有关csv库here的更多信息。如果文件格式不同,您只想使用分隔符和其他参数。

答案 1 :(得分:3)

创建csv文件时,添加标题:

people.csv

id  age  height
1   20   62
2   22   74
3   24   68

def handle_files(f):
    reader = csv.DictReader(open(f))
    for row in reader:
        id=row['id']
        age=row['age']
        height=row['height']
        my_object = MyObject(id=id, age=age,height=height)
        my_object.save()