录入数据到数据库
需求描述:
有一个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)
工作环境不一样,想完全照搬不可能,代码是在工作电脑上面执行的,就连我自己在自己电脑都有好多报错,懒得改了,不过思路可以看看