用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()