繁体   English   中英

我想从文本文件中读取数据并将其保存到Django中的数据库中

[英]I want to read data from text file and save it to database in Django

我是DjangoPython新手。 我想从文本文件中读取数据并将其保存到database

输入文件示例:

E Alan Marshall 121 55.26 
E Bob Marley 122 66.78
M Ted Smith Marketing 123 76.78 
M Ron Barly Production 124 86.78

我对models描述如下:

class Employee(models.Model):   
        first = models.CharField(max_length=20)
        last = models.CharField(max_length=20)
        id = models.IntegerField()
        pay = models.DecimalField(max_digits=12, decimal_places=2)

class Manager(models.Model):
        first = models.CharField(max_length=20)
        last = models.CharField(max_length=20)
        department = models.CharField(max_length=20)
        id = models.IntegerField()
        pay = models.DecimalField(max_digits=12, decimal_places=2)  

我以文本文件的形式接收数据,并通过解析字符串读取数据。 第一个字符告诉我期望的类数据的类型(例如E表示雇员类对象数据,M表示经理类对象数据)一旦我们知道了数据类型,变量发生的顺序就固定了。 意味着如果我用'space'作为定界符标记字符串,对于Employee类,第一个元素是名字,下一个是姓氏,下一个是员工ID,下一个是薪水

我想用python编写代码,它将解析输入文件并创建相应类的对象。 我也应该维护类变量的类型

type of
            first is string
            last is string
            id is interger
            pay is float
            department is string

我打算编写泛型函数来解析和创建类的对象。 它将逐行读取文件,对行进行标记并调用函数以生成类的对象。 "generateClassObject"函数将以变量名及其类型的字典作为输入。 (例如,对于Employee class {"first":"string", "last":"string", "id":"integer", "pay":"float" } ,对于经理class {"first":"string", "last":"string", "department":"string" "id":"integer", "pay":"float" } ),并返回类对象。

该函数看起来像

generateClassObject(className, dictionary, tokenizedData):
    # instantiate class object based on className (How to do this?)
    # read dictionary one by one and assign value to respective variable of
      # class object from tokenizedData by converting string data to proper
      # type (How to do this?)
    # save class object to database (I know how to do this)

是否可以在python dynamically创建类的对象? 如何基于className实例化类对象。 如果我们知道python合适的数据类型,如何将字符串数据转换成合适的数据类型?

您可以创建一个类方法。

class Employee(models.Model):   
        first = models.CharField(max_length=20)
        last = models.CharField(max_length=20)
        id = models.IntegerField()
        pay = models.DecimalField(max_digits=12, decimal_places=2)

        @classmethod
        def from_file(cls, line):
            # parse line of input here
            emp = cls.create(first=first, last=last, id=id, pay=pay)
            return emp

# code to read from file
line = file.readline()
if line.startswith("E"): 
    bob = Employee()
    bob.from_file(line)
    # add code to save to database

进一步阅读: https : //docs.djangoproject.com/en/2.1/ref/models/instances/

首先,我会严重质疑您为什么即使经理和雇员具有相同的字段也有各自的模型。 拥有一个带有role字段的单一模型会更好。

不过,如果您确实想执行此操作,则只需要保留将代码映射到模型的字典即可。

models = {
    'E': Employee,
    'M': Manager
}
instance = models[class_name].objects.create(**params)

我会接受@DanielRoseman的建议。 但是关于从文本文件开始的一般答案

import re
from project.models import CorporatePerson
with open('input_file.txt') as ifile:
    s = ifile.readline()
    m = re.search('([E,M]) (.{1,}) (.{1,}) (.{1,}) (.{1,}) (.{1,})', s)
    CorporatePerson.objects.create(
    role=m.group(0)
    first =m.group(1)
    department=m.group(2)
    id=m.group(3)
    pay=m.group(4)
    )

这要求您在输入文件中为每个employee department添加类似“ none ”的内容。

如果要坚持使用2个模型,则可以使用if语句使用将其保存到Employee还是Manager模型,然后将每个模型与自己的regex进行匹配,但是您明白了...

我知道这并不代表您的帖子中提到的令牌化,但是它提供了一个更容易编写(很容易修改)的更简单(可能更快捷,更肮脏的解决方案)。

如果您使用的是一遍又一遍的工具,我将创建一个类,该类可以消化文本文件,该文本文件的属性(或列)数量可能有所不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM