Python 将非结构化excel文件导入数据库

Python 将非结构化excel文件导入数据库,python,django,pandas,pyexcel,django-excel,Python,Django,Pandas,Pyexcel,Django Excel,我必须将excel文件中的数据导入数据库。 这些文件的结构与模型的结构不匹配,因此我想我需要进行某种数据操作来相应地排列元组 我必须导入的文件如下所示: django模型具有以下属性:国家、商品、年份、价值 那么,读取数据、以正确的结构排列数据并将其导入数据库(最好是自动更新现有元组)的最佳方式是什么呢 我花了很多时间研究现有的python和django库来满足这一需求(比如PyExcel、Pandas、django Excel、django Import Export),但我无法真正找出哪个

我必须将excel文件中的数据导入数据库。 这些文件的结构与模型的结构不匹配,因此我想我需要进行某种数据操作来相应地排列元组

我必须导入的文件如下所示:

django模型具有以下属性:国家、商品、年份、价值

那么,读取数据、以正确的结构排列数据并将其导入数据库(最好是自动更新现有元组)的最佳方式是什么呢

我花了很多时间研究现有的python和django库来满足这一需求(比如PyExcel、Pandas、django Excel、django Import Export),但我无法真正找出哪个是最好的,以及它是否支持在导入之前重新排列数据


我希望你能为这项任务给我一些建议和解决方案:)

好的,有几件事。请注意,我不是这些方面的专家

首先,如果您的数据是Excel文件,那么它是结构化的。表的本质是构造数据。非结构化数据类似于文本文件或文本文件目录

第二,请阅读此内容,并在制定问题时遵循此内容:

第三,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文件,则可以使用
glob
os.walk
在目录中迭代,并导入部分或全部Excel文件


您可以使用pandas
DataFrame.to_sql
将数据上载到sql数据库,这需要定义数据库连接(服务器地址、登录/pw等)。

这是使用一个外键插入的示例

    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)
在导入表1中插入数据的行之前,需要创建modelResource并重写。您还可以更改字段的名称、创建表和自定义列_name'是excel数据中字段的名称,属性是数据库中字段的名称。在方法nefore_import中,您可以在表中插入数据并指定外键

并将ModelResource设置为admin类

    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

就这些

什么是“数据库”?您只是将文件上传到数据库,还是必须进行某种分析?到目前为止你尝试了什么?@Evan我只想把文件中的数据输入数据库,不需要分析。但是如上所述,我需要手动调整结构,因为数据集不是每年都分离的。基本上,我认为某个库允许我将excel数据读入数据结构(数组或dict),然后编辑/调整该数组,然后将其输入数据库是最好的。不幸的是,我没有从上述任何库中找到相关信息。根据您所说的,我建议使用pandas库及其read_excel()函数。您可以创建数据帧,对其进行操作,并将其输出到CSV或数据库(例如SQL),但如果您不告诉我们您的数据库是什么,我们将无法帮助您。@Evan好的,我会查一下。数据库是带有django模型的PostgreSQL。db对我如何实现功能有影响吗?谢谢,到目前为止工作得很好。不幸的是,我遇到了另一个问题:excel文件的末尾有一些我想跳过的信息。但是,这些行的数量因文件而异。此信息的开头由带有特定关键字的行标识。我对pandas的索引以及如何跳过/删除某些行进行了大量研究,但我找不到以下方面的信息:如何跳过/删除从特定行开始的所有行?这是一种非常适合其自身线程堆栈溢出的特定问题,尤其是在现有问题中找不到答案的情况下。也就是说,我在几秒钟的谷歌搜索中发现了一对: