Django读取/上传CSV

Pro*_*eus 4 python django

我需要上传并读取CSV然后保存到数据库.我是初学者,下面是我迄今为止使用'django-adapters'(http://django-adaptors.readthedocs.org/en/latest/index.html)所取得的成就.我知道它不是很多,但我'我只是这样做了解更多:)

我在代码的视图中苦苦挣扎(下图).我不知道如何上传然后将文件读入CodeCSvModel()函数?谁能帮忙解释一下?非常感谢.:)

views.py

from django.template import RequestContext
from django.shortcuts import render_to_response
from web.forms import codeUploadForm
from web.csvTools import CodeCSvModel


def codeImport(request):
    # If we had a POST then get the request post values.
    if request.method == 'POST':
        form = codeUploadForm(request.POST, request.FILES)
      # handle_uploaded_file(request.FILES['file'])

                ====[HELP HERE]=====

        #form = codeUploadForm(request.POST)

        CodeCSvModel.import_from_file(form['file'])



    else:
         form = codeUploadForm()
         context = {'form':form}
         return render_to_response('import.html', context, context_instance=RequestContext(request))  
Run Code Online (Sandbox Code Playgroud)

forms.py

class codeUploadForm(forms.Form):

    file = forms.FileField()
    place = forms.ModelChoiceField(queryset=Incentive.objects.all())
Run Code Online (Sandbox Code Playgroud)

csvTool.py

from datetime import datetime
from adaptor.fields import *
from adaptor.model import CsvModel, CsvDbModel, ImproperlyConfigured,\
    CsvException, CsvDataException, TabularLayout, SkipRow,\
    GroupedCsvModel, CsvFieldDataException
from web.models import *



class CodeCSvModel(CsvModel):

    codeid = CharField()
    remotecode = CharField()
    active = BooleanField()
    created = DateField()
    modified = DateField()
    incentiveid = CharField()

    class Meta:
        delimiter = ";"
        dbModel = Code
Run Code Online (Sandbox Code Playgroud)

kas*_*led 5

如果上传的文件是2.5MB或更小,Django只会将上传的文件保留在内存中,否则会写入临时位置.

您缺少的步骤是您实际将文件从内存/临时位置写入磁盘的位置,例如

if request.method == 'POST':
    form = MyForm(request.POST, request.FILES)
    if form.is_valid():
        uploaded_file = request.FILES['html-file-attribute-name']

        # Write the file to disk
        fout = open("path/to/save/file/to/%s" % uploaded_file.name, 'wb')
        for chunk in uploaded_file.chunks():
            fout.write(chunk)
        fout.close()
Run Code Online (Sandbox Code Playgroud)

如果文件非常大,则Chunking是要走的路,因为Django会在写入磁盘之前将文件的每个块读入内存.如果你改用read(),它会将整个文件读入内存,所以你最好打算使用chunk.