python 将非结构化Excel文件导入数据库

niwlg2el  于 2023-04-19  发布在  Python
关注(0)|答案(2)|浏览(177)

我必须从Excel文件中导入数据到数据库中。这些文件的结构与模型的结构不匹配,所以我想我需要做一些数据操作来相应地排列元组。
我必须导入的文件如下所示:

django-model具有以下属性:国家、商品、年份、值
那么,读取数据、以正确的结构排列数据并将其导入数据库(最好是自动更新现有元组)的最佳方法是什么呢?
我花了很多时间研究现有的python和django库(如PyExcel,Pandas,Django-Excel,Django-Import-Export),但我无法真正找到哪个是最好的,以及它是否支持在导入之前重新排列数据。
我希望你能给予我一些建议和解决这个问题的方法。

dfty9e19

dfty9e191#

好吧,有几件事。注意我不是其中任何一件的Maven。
首先,如果你的数据是一个Excel文件,它是结构化的。表的本质是结构化的数据。非结构化的数据可能是一个文本文件或文本文件的目录。
第二,请阅读这篇文章,并在制定问题时遵循它:https://stackoverflow.com/help/mcve
第三,SO并不是为你写所有的代码。根据你的问题,你还没有尝试任何东西,这就是为什么你的问题被否决了。
除了序言,您可以使用Python的pandas库导入Excel文件,操作它们,并将它们上传到SQL数据库。

import pandas as pd

df = pd.read_excel('tmp.xlsx')
df2 = pd.melt(df, id_vars = ['Country', 'Commodity'], var_name = 'Year', value_name = 'Value')
df2

输入:

Country Commodity  2009  2010  2011  2012  2013
0  Austria    Com. 1     1     1     1     1     1
1  Austria    Com. 2     2     2     2     2     2
2  Belgium    Com. 1     3     3     3     3     3
3   France    Com. 1     4     4     4     4     4

输出:

Country Commodity  Year  Value
0  Austria    Com. 1  2009      1
1  Austria    Com. 2  2009      2
2  Belgium    Com. 1  2009      3
3   France    Com. 1  2009      4
4  Austria    Com. 1  2010      1

如果您有许多Excel文件,则可以使用globos.walk遍历/遍历目录,并导入部分或全部Excel文件。
您可以使用pandas DataFrame.to_sql将数据上传到SQL数据库,这需要定义数据库连接(服务器地址,登录/pw等)。

vltsax25

vltsax252#

这是一个带有一个外键的插入示例。

models.py

        from django.db import models

        class Table1(models.Model):
            system = models.CharField(max_length=383)

        class Table2(models.Model):
            name = models.CharField(max_length=383)
            system = models.ForeignKey(Table1, blank=True, null=True, on_delete=models.CASCADE)

你需要创建一个modelResource和覆盖before_import_row来插入table1中的数据。你可以改变字段的名称,创建表和自定义。'column_name'是excel数据中字段的名称,attribute是数据库中字段的名称。在方法nefore_import中你可以插入数据到表中并指定外键。
并将ModelResource设置为admin class。

admin.py
        from .models import Table1,Table2
        from import_export import resources,widgets
        from import_export.fields import Field
        from django.contrib import admin

        class Table2Resource(resources.ModelResource):
            name = Field(column_name='name',attribute='name')
            system_id = Field(column_name='system', attribute='system_id', widget=widgets.ForeignKeyWidget(Table1))

            class Meta:
                model = Table2
                skip_unchanged = True
                fields = ('name','system_id')

            def before_import_row(self,row, **kwargs):
                value = row['system']
                obj = Table1.objects.create(system = value) #create object place
                row['system'] = obj.id # update value to id ob new object

        @admin.register(Table2)
        class Table2Admin(ImportExportModelAdmin,admin.ModelAdmin):
            resource_class = Table2Resource

就这些了

相关问题