首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将扫描文本中的数据导入Django模型

如何将扫描文本中的数据导入Django模型
EN

Stack Overflow用户
提问于 2011-10-21 03:24:54
回答 2查看 641关注 0票数 4

我有数百页的“问答”问题,选择题和相关的答案键和解释。我正在尝试创建一个简单的Django应用程序来管理这些问题。我创建了一个简单但有效的Python解析器,将扫描的OCR页面解析为适当的对象。

我希望有一个“实用程序”,使这个Django应用程序的管理员能够将测试内容从OCR'd论文导入到相关的Django DB表中。这将是一项罕见的任务,而且不一定适合包含在web中。

我询问过如何使用中间JSON/YAML插件,并被告知更合适的方法是直接创建和保存模型1的实例。然后,我尝试按照2和3所建议的方式创建独立脚本,但无法克服kwargs = {"app_label": model_module.__name__.split('.')[-2]} IndexError: list index out of range错误。

我还遇到了关于创建定制django-admin.py/manage.py e.py命令的4条命令。这似乎是处理这项任务的一种逻辑上合适的方法;但是,我想听听那些有更多经验和头脑的人的意见(我已经吃光了所有的:)。

参考文献:

  1. 将扫描文本中的数据导入Django作为YAML工具或SQL
  2. 使用django db api并基于“独立Django脚本”创建表的最简单方法是什么
  3. 独立脚本
  4. 编写自定义django-admin命令

示例:

  • OCR文本

第12页34。Hiedegger是一个_____。(a)哲学家(b)酗酒的乞丐(c) a和b (d) -这35人都不是。..。

  • Django模型 类问题(models.Model):文本= models.TextField()类选择(models.Model):问题=models.ForeignKey(问题)顺序= models.IntegerField(default=1) text = models.TextField()
  • 目标就像这样..。 Q= Question.objects.create(text="Hiedegger是_____ .")q.save() c=选择(text=“哲学家”,order=1,question=q.pk) c.save()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-23 23:50:14

这是我想出的工作版本。肮脏但有效。“akonsu”和“Ivan Kharlamov”都很有帮助。谢谢..。

代码语言:javascript
复制
import os, re, Levenshtein as lev, codecs
from SimpleQuiz.quiz.models import Choice, Question
from django.core.management.base import BaseCommand, CommandError
import optparse

class Command(BaseCommand):
    args = '--datapath=/path/to/text/data/'
    can_import_settings = True
    help = 'Imports scanned text into Questions and Choices'
    option_list = BaseCommand.option_list + (
        optparse.make_option('--datapath', action='store', type='string',
                             dest='datapath',
                             help='Path to OCRd text files to be parsed.'),
        )
    requires_model_validation = True
    # Parser REs
    BACKUP_RE = re.compile(r'\~$|bak$|back$|backup$')
    QUEST_RE = re.compile(r'^[0-9]{1,3}[.][ ]')
    CHOICE_RE = re.compile(r'^[a-e][.][ ]')

    def handle(self, *args, **options):
        # get the data path
        try:
            os.path.exists(options['datapath'])
        except Exception as e:
            raise CommandError("None or invalid path provided: %s" % e.message)
        self.datapath = os.path.expanduser(options['datapath'])

        # generate list of text strings from lines in target files
        self.data_lines = []
        for fn in os.listdir(os.path.join(self.datapath, 'questions/')):
            if self.BACKUP_RE.search(fn):
                self.stderr.write("Skipping backup: %s\n" % (fn))
            else:
                for line in codecs.open(os.path.join(self.datapath, 'questions/', fn), 'r', encoding='latin-1'):
                    if not self.is_boilerplate(line):
                        if not line.strip() == '':
                            self.data_lines.append(line)

    #----------------------------------------------------------------------- 
    #--------------------- Parse the text lines and create Questions/Choices
    #----------------------------------------------------------------------- 
        cur_quest = None
        cur_choice = None
        cur_is_quest = False
        questions = {}
        choices = {}
        for line in self.data_lines:
            if self.is_question(line):
                [n, txt] = line.split('.', 1)
                qtext = txt.rstrip() + " "
                q = Question.objects.create(text=qtext)
                q.save()
                cur_quest = q.pk
                questions[cur_quest] = q
                cur_is_quest = True
            elif self.is_choice(line):
                [n, txt] = line.split('.', 1)
                num = self.char2dig(n)
                ctext = txt.rstrip() + " "
                c = Choice.objects.create(text=ctext, order=num, question=questions[cur_quest])
                c.save()
                cur_choice = c.pk
                choices[cur_choice] = c
                cur_is_quest = False
            else:
                if cur_is_quest:
                    questions[cur_quest].text += line.rstrip() + " "
                    questions[cur_quest].save()
                else:
                    choices[cur_choice].text += line.rstrip() + " "
                    choices[cur_choice].save()
        self.stdout.write("----- FINISHED -----\n")
        return None

    def is_question(self, arg_str):
        if self.QUEST_RE.search(arg_str):
            return True
        else:
            return False

    def is_choice(self, arg_str):
        if self.CHOICE_RE.search(arg_str):
            return True
        else:
            return False

    def char2dig(self, x):
        if x == 'a':
            return 1
        if x == 'b':
            return 2
        if x == 'c':
            return 3
        if x == 'd':
            return 4
        if x == 'e':
            return 5

    def is_boilerplate(self, arg_str):
        boilerplate = [u'MFT PRACTICE EXAMINATIONS',
                       u'BERKELEY TRAINING ASSOCIATES ' + u'\u00A9' + u' 2009',
                       u'BERKELEY TRAINING ASSOCIATES',
                       u'MARRIAGE AND FAMILY THERAPY',
                       u'PRACTICE EXAMINATION 41',
                       u'Page 0', u'Page 1', u'Page 2', u'Page 3', u'Page 4',
                       u'Page 5', u'Page 6', u'Page 7', u'Page 8', u'Page 9',
                       ]
        for bp in boilerplate:
            if lev.distance(bp.encode('utf-8'), arg_str.encode('utf-8')) < 4:
                return True
        return False
票数 0
EN

Stack Overflow用户

发布于 2011-12-16 22:32:48

然后,我试图按照2和3的建议创建一个独立的脚本,但是无法克服kwargs = {"app_label":app_label IndexError: list索引超出范围的错误。

我也有同样的列表索引错误。这是我在脚本中导入模型的方式造成的。我以前是这样做的

代码语言:javascript
复制
from models import Table1, Table2

然后我意识到Python脚本不是应用程序的一部分,所以我将导入更改为:

代码语言:javascript
复制
from myapp.models import Table1, Table2

我的Python脚本是用以下shell脚本启动的:

代码语言:javascript
复制
export DJANGO_SETTINGS_MODULE=settings
export PYTHONPATH=/path/to/my/site
python myscript.py "$@"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7844630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档