pandas从excel导入数据,写入数据库

用pandas从excel导入数据,到写入数据库, 综合来说其实很简单,只有pandas库中的两个函数:1.read_excel(),2.to_spl()。

首先先导入pandas库:

import pandas as pd

初始化参数:


    def __init__(self):
        self.path = os.path.join(settings.BASE_DIR, 'static/xls/basic.xls')  # excel的存放路径
        self.engine = create_engine('mysql+pymysql://test:test@localhost:3306/goldtwo?charset=utf8', encoding="utf-8")  # 建立数据库连接

从excel中导入数据: 原文—>http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html?highlight=read_excel#pandas.read_excel


'''
pd.read_excel()
该函数主要的参数为io、sheetname、header、names、encoding。
io:excel文件,可以是文件路径、文件网址、file-like对象、xlrd workbook;
sheetname:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型,返回字典{'key':'sheet'})、none(返回字典,全部sheet);
header:指定数据表的表头,默认取第一行为表头,可以设置为None不取表头,默认为header=0;
names:返回指定name的列,参数为array-like对象。
encoding:关键字参数,指定以何种编码读取。
该函数返回pandas中的DataFrame或dict of DataFrame对象,利用DataFrame的相关操作即可读取相应的数据。
'''        
data_dict = pd.read_excel(self.path,sheet_name=["国家代码", "包装种类"], encoding="UTF-8")
data_dict2 = pd.read_excel(self.path,sheet_name=["币种代码", "货物通关代码", "联系人方式"], header=None, encoding="UTF-8") 

写入数据库,这里需要注意 连接数据库不能使用pymysql,需要使用python的ORM框架 —> SQLAlchemy 使用上面的create_engine()函数创建连接。关于to_sql参数  原文—>http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html

"""
DataFrame类型.to_sql()
name:string
SQL表的名称
con:SQLAlchemy引擎或DBAPI2连接(传统模式)
使用SQLAlchemy可以使用该库支持的任何数据库。如果是DBAPI2对象,则仅支持sqlite3。
flavor:'sqlite',默认无
从版本0.19.0开始不推荐使用:如果不使用SQLAlchemy,则'sqlite'是唯一受支持的选项。
schema:string,默认无
指定架构(如果数据库flavor支持此)。如果为None,请使用默认架构。
if_exists:{'fail','replace','append'},默认'fail'
失败:如果表存在,则不执行任何操作。
replace:如果表存在,则删除它,重新创建它,然后插入数据。
append:如果表存在,则插入数据。创建如果不存在。
index:布尔值,默认为True
将DataFrame索引写为列。
index_label:字符串或序列,默认为None
索引列的列标签。如果给出None(默认)且 index为True,则使用索引名称。如果DataFrame使用MultiIndex,则应该给出一个序列。
chunksize:int,默认无
如果不是None,那么每次都会批量写入这些大小的行。如果为None,则将立即写入所有行。
dtype:列名称为SQL类型的dict,默认为None
可选指定列的数据类型。SQL类型应该是SQLAlchemy类型,或者是sqlite3后备连接的字符串。
"""

self.country.to_sql("ManifestCountryCode", self.engine, if_exists='append', index=False)

这就写入数据库拉,好啦!

贴出完整代码:

import os
import pandas as pd
import numpy as np
from sqlalchemy import create_engine

from CustomsClearance import settings


class SaveManifestBasic(object):
    """读取excel数据 保存 公路舱单的基本信息"""
    def __init__(self):
        self.path = os.path.join(settings.BASE_DIR, 'static/xls/basic.xls')
        self.engine = create_engine('mysql+pymysql://btrProject:[email protected]:3306/goldtwo8.1?charset=utf8', encoding="utf-8")
        self.country = None  # 国家代码
        self.wraptype = None  # 包装种类
        self.currcode = None  # 币种代码
        self.carnetcode = None  # 货物通关代码
        self.communication = None  # 联系人方式

    def start(self):
        self.manifest_read_excel()
        self.hanlder_data()
        self.insert_data()

    def manifest_read_excel(self):
        ''' 读取excel数据'''
        data_dict = pd.read_excel(self.path,sheet_name=["国家代码", "包装种类"], encoding="UTF-8")
        data_dict2 = pd.read_excel(self.path,sheet_name=["币种代码", "货物通关代码", "联系人方式"], header=None, encoding="UTF-8")
        self.country = pd.DataFrame(data_dict.get("国家代码"))
        self.wraptype = pd.DataFrame(data_dict.get("包装种类"))
        self.currcode = pd.DataFrame(data_dict2.get("币种代码"))
        self.carnetcode = pd.DataFrame(data_dict2.get("货物通关代码"))
        self.communication = pd.DataFrame(data_dict2.get("联系人方式"))

    def hanlder_data(self):
        """ 处理excel 导入的数据"""
        # 国家代码处理
        self.country["ISO 3166-1-alpha-2 code"] = self.country["ISO 3166-1-alpha-2 code"].apply(lambda x: np.NaN if str(x).isspace() else x) # 把空格替换成np.nan
        self.country.rename(columns=({'ISO 3166-1-alpha-2 code': 'Code', 'Country names': 'Name',}), inplace=True)  #  修改列名
        self.country.dropna(axis=0, how='any', inplace=True)  # 删除空值的行  axis:0为行1为列
        # 包装种类处理
        self.wraptype.columns = ["code","numbercode","name","nameen"]  # 换列名 匹配表结构
        # 币种代码
        self.currcode.columns = ["code", "name"]
        # 货物通关代码
        self.carnetcode.columns = ["code", "name"]
        # 联系人方式
        self.communication.columns = ["code", "nameen", "name"]

        print(self.wraptype)
        print(self.currcode)
        print(self.carnetcode)

    def insert_data(self):
        # 将表格的数据导入数据库
        # with transaction.atomic():
        self.country.to_sql("ManifestCountryCode", self.engine, if_exists='append', index=False)
        self.wraptype.to_sql("ManifestWraptype", self.engine, if_exists='append', index=False)
        self.currcode.to_sql("ManifestCurrCode", self.engine, if_exists='append', index=False)
        self.carnetcode.to_sql("ManifestCarnetCode", self.engine, if_exists='append', index=False)
        self.communication.to_sql("ManifestCommunication", self.engine, if_exists='append', index=False)


if __name__ == '__main__':
    save = SaveManifestBasic()
    save.start()

 

你可能感兴趣的:(pandas从excel导入数据,写入数据库)