录入数据到数据库

需求描述:

有一个summary的总表,表中数据为文件路径和文件名,以及文件中数据量
进入summary表中文件路径所对应的文件表中,更改表头为匹配数据库的字段
表中数据录入到数据库后,查询数据库录入后数据量
把数据量写入summary表中,并标注已录入

遇到问题:

summary表中对应的文件xls和xlsx格式都有
XLS和xlsx文件对于Python来说完全就是俩格式,有的库支持XLS格式不支持xlsx格式,有的库就是反过来
支持xls的说xlsx格式不好,支持xlsx格式的说xls格式太老,这不是**(自动消音)
summary表中对应的文件有的还不含有表头需要自己添加

应对方法:

不是完全自动操作,但是对应一张一张表手动修改表头以及录入来说减少了好多工作量(当你录入两千个xls或者xlsx文件一两千万个数据的时候)
手动进入summary表对应的文件中看,如果是含表头且可以修改,记录文件路径,如果不含表头,手动添加后记录文件路径(谢天谢地不含表头的还是比较少的,要不更累)然后把文件路径放到主函数的test中自己执行批量改表头和录入数据库,查询数据库,更新summary表操作,其中xls格式的自动转换成转xlsx格式进行读写

代码:

# coding:utf-8
import time
from sqlalchemy import create_engine
import xlrd
import openpyxl as op
import pandas as pd
import os

def query():
print("querying...")
# 初始化数据库连接,使用pymysql模块
# MySQL的用户:root, 密码:147369, 端口:3306,数据库:test
engine = create_engine("mysql+pymysql:自己数据库的值")
print("queryover")
return engine

def replace_excel(str5):  # xls格式转xlsx格式
str6 = str5.replace("\\\\", "\\")
import win32com.client
excel = win32com.client.gencache.EnsureDispatch('Excel.Application')  # 要看MIME手册
wb = excel.Workbooks.Open(str6)
str7 = str6 + "x"
wb.SaveAs(str7, FileFormat=51)
wb.Close()
excel.Application.Quit()
os.remove(str6)
return str7

def returnstr(str1):  # 格式化文件路径
str2 = "D:\\\\XZ\\\\"
# str2 = "C:\\\\Users\\\\Hylink\\\\Desktop\\\\"
str3 = str1.replace("\\", "\\\\")
str4 = str3.replace("./", "")
str5 = str2 + str4
if str5.find("xlsx") != -1:
str6 = str5
elif str1.find("XLSx") != -1:
str6 = str5
else:
str6 = replace_excel(str5)
return str6

def change2(data):  # 改表头时所需替换的字段
data.rename(  # rename重命名函数
columns={"改之前表头": "改之后表头", "改之前表头": "改之后表头"}, inplace=True)
return data

def change(str2):  # 改表头
with pd.ExcelWriter(str2) as writer:  # pd.ExcelWriter保存结果到已存在的excel文件中,并支持多个sheet表格写入excel
data_xls = pd.io.excel.ExcelFile(str2)  # 打开文件
data = {}
print(data_xls.sheet_names)  # data_xls.sheet_names,文件中所有表名
for name in data_xls.sheet_names:  # 遍历所有表
df = pd.read_excel(data_xls, sheet_name=name, header=0)  # 打开特定表名的表
df = df.loc[:, ~df.columns.str.contains('Unnamed')]  # 删除Unnamed:
data[name] = df  # 读取特定表名的数据
df = change2(df)  # 替换表头
# print(data)
# print(data[name])
df.to_excel(writer, index=False, sheet_name=name)  # 重新写入表

def insql(str2, engine):  # 录入数据库
print("insql")
data_xls = pd.io.excel.ExcelFile(str2)  # 打开文件
data = {}
# print(data_xls.sheet_names)
for name in data_xls.sheet_names:  # 遍历所有表
df = pd.read_excel(data_xls, sheet_name=name, header=0)  # 打开特定表名的表
columns_names = df.columns.values.tolist()  # 读取表头
# print(columns_names)
index = []  # 定义一个空列表
for i in columns_names:  # 遍历表头
if i != '':  # 条件判断:非空
if i.find("Unnamed:") == -1:  # 条件判断:非Unnamed:x
index.append(i)  # 添加到index列表中
print(i)
dataset = df[index]  # 字典
print(dataset)
print("insqling...")
con = engine.connect()  # 创建连接
dataset.to_sql(name='t_kdxx_all_2', con=con, if_exists='append', index=False)  # 录进数据库
print("insqlover")

def queryGp(sql, engine):  # 查询数据库
print("queryGping...")
df = pd.read_sql(sql, con=engine, parse_dates=True)  # 查询数据库
str1 = str(df)  # 查询后格式化得到结果
str2 = str1.replace("count(1)", "")  # 查询后格式化得到结果
str3 = str2.replace("0  ", "", 1)  # replace("0  ", "", 1)"0  "替换为"",仅替换一次
str4 = str3.replace('\n', '').replace('   ', '')  # 查询后格式化得到结果
print(str4)  # 输出格式化后结果
print("queryGpover")
return str4

def write(name, n):  # 查询后数值写进summary.xlsx
print("writeing...")
wbb = xlrd.open_workbook(r"路径\summary.xlsx")  # 用xlrd打开文件
Table = wbb.sheet_by_name("Sheet1")  # 打开文件Sheet1表
# Table = workbook.sheet_by_index(0)

length = Table.nrows # 逐行读取
for i in range(length): # 遍历所有行

# print("i")
row = Table.row_values(i)  # 行数据给一个变量
if name in row[0]:  # 找到指定行
    wb = op.load_workbook(r"路径\summary.xlsx")  # 用openpyxl打开文件
    sh = wb["Sheet1"]  # 打开Sheet表
    # sh.cell(row=i + 1, column=4, value='已导入')#更改特定行列内容
    wbb.put_cell(row=i + 1, column=4, ctype=1, value='已导入', xf=0)
    # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    sh.cell(row=i + 1, column=5, value=n)  # 更改特定行列内容

    wb.save(r"路径\summary.xlsx")  # 保存
    print("更新成功")
    break
# else:
#     print("更新失败,请手动查看")

print("writeover")


if __name__ == "__main__":
start = time.time()
test = [r"路径\.xlsx",
r"路径\.xls",
]
for str1 in test:
str1 = str1.replace("D:\\XZ\\", "")
str3 = './' + str1
str2 = returnstr(str1)
change(str2)
engine = query()
insql(str2, engine)
sql = 'SELECT count(1) FROM `t_kdxx_all_2`;'
n = queryGp(sql, engine)

write(str3, n)
print(str3)

end = time.time()
print("执行时间", end - start)

工作环境不一样,想完全照搬不可能,代码是在工作电脑上面执行的,就连我自己在自己电脑都有好多报错,懒得改了,不过思路可以看看

最后修改:2021 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏