如何使用TXT数据文件填充SQLITE3模型

时间:2014-02-24 20:20:34

标签: python django models

我有以下models.py:

from django.db import models

class User_Language(models.Model):
    user = models.CharField(max_length=100)
    language = models.CharField(max_length=100)

这就是form.py:

from django import forms

class file_upload_form(forms.Form):
    title = forms.CharField(max_length=100)
    file = forms.FileField()

这个Txt数据文件,用标签分隔:

Lucas Rezende   Python
Fabricio    Django
Pappacena   Python

我创建了这个视图,它基本上呈现了html文件来处理Txt文件:

from django.shortcuts import render, redirect
from forms import file_upload_form
from models import User_Language
from myfreecomm.settings import MEDIA_ROOT

def upload_file(request):
    ''' 
    This view handles the file upload 
    '''

    if request.method == 'POST':
        form = file_upload_form(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            filename = file['filename']
            f = open('%s%s' % (MEDIA_ROOT, filename), 'r')

            for line in f.readline().split('\t'):
                table = User_Language(user = line[0], language = line[1])
                table.save()
            return redirect('/success_upload/')

    else:
        form = file_upload_form()
    return render(request, 'upload/upload.html', locals())

def success(request):
    return render(request, 'upload/sucess.html', locals())

此时我无法弄清楚如何将名为data.txt的此Txt文件插入到表User_Language中。

我试着在Google上查看回复,但无法弄清楚如何完成回复。

有人可以向我澄清这个问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

首先,您应该决定是否需要保存上传的文件。如果您只需要访问上传的文件内容,则可以访问上传文件的文件对象,如:

if form.is_valid():
    doc_fo = form.cleaned_data['file']
    for line in doc_fo.readline().split('\t'):
        ...

UPD。

如果你想将它加载到db中,你应该在你的模型中使用BinaryField,如果你使用django 1.6。如果您使用早期版本的django,则应在模型中使用TextField并使用Base64编码/解码文件内容

模型中的二进制字段:

x = ModelX()
doc_fo = form.cleaned_data['file']
x.file = doc_fo.read()
x.save()

模型中的TextField:

import base64

x = ModelX()
doc_fo = form.cleaned_data['file']
x.file = base64.b64encode(doc_fo.read())
x.save()

稍后获取内容:

file_content = base64.b64decode(x.file)

答案 1 :(得分:0)

这是一个简单的模型,因此您可以在数据库级别执行此操作。这可能不是一旦你的模型发展的最佳实践,但如果你使用south进行迁移,它可能没问题。

因此,您应该访问控制台访问sqlite并发出以下命令:

.separator "\t"
.import sample.csv user_language
select * from user_language; --> you should now have data here.

在我的例子中,db文件和csv文件位于同一文件夹中。