支持一次性导出多个数据源表、自动获取各表的字段名。
支持控制批次的写入速率。例如:每5000行一个批次写入到excel。
支持结构相同的表导入到同一个Excel文件。可适用于经过水平切分后的分布式表。
-
A[创建类] -->|方法1| B(创建数据库连接)
-
A[创建类] -->|方法2| C(取查询结果集)
-
A[创建类] -->|方法3| D(利用句柄写入Excel)
-
A[创建类] -->|方法4| E(读取多个源表)
-
B(创建数据库连接) -->U(调用示例)
-
C(取查询结果集) -->U(调用示例)
-
D(利用句柄写入Excel) -->U(调用示例)
-
E(读取多个源表) -->U(调用示例)
2、主要方法
首先需要安装第三方库pymssql实现对SQLServer的连接访问,自定义方法__getConn()需要指定如下五个参数:服务器host、登录用户名user、登录密码pwd、指定的数据库db、字符编码charset。连接成功后,通过cursor()获取游标对象,它将用来执行数据库脚本,并得到返回结果集和数据总量。
创建数据库连接和执行SQL的源码:
def
__init__
(
self
,
host
,
user
,
pwd
,
db
)
:
self
.
host
=
host
self
.
user
=
user
self
.
pwd
=
pwd
self
.
db
=
db
def
__getConn
(
self
)
:
if
not
self
.
db
:
raise
(
NameError
,
'没有设置数据库信息'
)
self
.
conn
=
pymssql
.
connect
(
host
=
self
.
host
,
user
=
self
.
user
,
password
=
self
.
pwd
,
database
=
self
.
db
,
charset
=
'utf8'
)
cur
=
self
.
conn
.
cursor
(
)
if
not
cur
:
raise
(
NameError
,
'连接数据库失败'
)
else
:
return
cur
3、方法3中写入Excel时,注意一定要用到Pandas中的公共句柄ExcelWriter对象writer。当数据被分批多次写入同一个文件时,如果直接使用to_excel()方法,则前面批次的结果集将会被后续结果覆盖。增加了这个公共句柄限制后,后面的写入会累加到前面写入的数据尾部行,而不是全部覆盖。
writer = pd.ExcelWriter(file)
df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
分批次写入到目标Excel时的另一个要注意的参数是写入行startrow的设置。每次写入完成后需要重新指下一批次数据的初始位置值。每个批次的数据会记录各自的所属批次信息。
利用关键字参数**args 指定多个数据源表和数据库连接。
def exportToExcel(self, **args):
for sourceTB in args['sourceTB']:
arc_dict = dict(
sourceTB = sourceTB,
path=args['path'],
startRow=args['startRow'],
isHeader=args['isHeader'],
batch=args['batch']
print('\n当前导出的数据表为:%s' %(sourceTB))
self.writeToExcel(**arc_dict)
return 'success'
import pymssql
import pandas as pd
import datetime
import math
class MSSQL(object):
def __init__(self,host,user,pwd,db):
self.host = host
self.user = user
self.pwd = pwd
self.db = db
def __getConn(self):
if not self.db:
raise(NameError,'没有设置数据库信息')
self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db, charset='utf8')
cur = self.conn.cursor()
if not cur:
raise(NameError,'连接数据库失败')
else:
return cur
...
学Python的过程中,往往因为没有资料或者没人指导从而导致自己不想学下去, 因此特意准备了个QQ群991032883,可以获取源码,解答,学习路线、开发工具等给大家免费使用!
...
def executeQuery(self,sql):
cur = self.__getConn()
cur.execute(sql)
resList, rowcount = cur.fetchall(),cur.rowcount
self.conn.close()
return (resList, rowcount)
def writeToExcel(self,**args):
sourceTB = args['sourceTB']
columns = args.get('columns')
path=args['path']
fname=args.get('fname')
startRow=args['startRow']
isHeader=args['isHeader']
N=args['batch']
if columns is None:
columns_select = ' * '
else:
columns_select = ','.join(columns)
if fname is None:
fname=sourceTB+'_exportData.xlsx'
file = path + fname
writer = pd.ExcelWriter(file)
sql_select = 'select '+ columns_select + ' from '+ sourceTB
fetch_data, rowcount = self.executeQuery(sql_select)
df_fetch_data = pd.DataFrame(fetch_data)
times = math.floor(rowcount/N)
i = 1
rs_startrow = 0
print(i, times)
is_while=0
while i <= times:
is_while = 1
if i==1:
startRow = 1
else:
startRow+=N
df_fetch_data['batch'] = 'batch'+str(i)
df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
print('第',str(i),'次循环,取源数据第',rs_startrow,'行至',i*N,'行','写入到第',startRow,'行')
print('第',str(i),'次写入数据为:',df_fetch_data[rs_startrow:i*N])
rs_startrow =i * N
i+=1
if is_while == 0:
startRow = startRow
else:
startRow+=N
df_fetch_data['batch'] = 'batch'+str(i)
print('第{0}次读取数据,从第{1}行开始,写入到第{2}行!'.format(str(i), str(rs_startrow), str(startRow)))
print('第',str(i),'写入数据为:',df_fetch_data[rs_startrow:i*N])
df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
writer.save()
start_time=datetime.datetime.now()
def exportToExcel(self, **args):
for sourceTB in args['sourceTB']:
arc_dict = dict(
sourceTB = sourceTB,
path=args['path'],
startRow=args['startRow'],
isHeader=args['isHeader'],
batch=args['batch']
print('\n当前导出的数据表为:%s' %(sourceTB))
self.writeToExcel(**arc_dict)
return 'success'
start_time=datetime.datetime.now()
if __name__ == "__main__":
ms = MSSQL(host="localhost",user="test",pwd="test",db="db_jun")
args = dict(
sourceTB = ['tb2', 'tb1'],
path='D:\\myPC\\Python\\',
startRow=1,
isHeader=False,
batch=5
ms.exportToExcel(**args)
一、应用场景为了避免反复的手手工从后台数据库导出某些数据表到Excel文件、高效率到多份离线数据。二、功能事项支持一次性导出多个数据源表、自动获取各表的字段名。支持控制批次的写入速率。例如:每5000行一个批次写入到excel。支持结构相同的表导入到同一个Excel文件。可适用于经过水平切分后的分布式表。三、主要实现1、概览A[创建类] -->|方法1| B(创建数据库连接)A[创建类] -->|方法2| C(取查询结果集)A[创建类] -->|方法3| D(利用句柄
import pandas as pd
df = pd.read_excel('/users/jick/desktop/python/students.xlsx')#读取ex表
class_list = df['course'].unique()#去重
for i in
处理Excel表格时,当数据量较大,或计算较为复杂时,使用python进行数据批量处理更为容易。
关于读取excel表格:
在向编译器中导入excel表格时,我们应当首先导入对应的包,否则极易出现报错、数据导入不成功等问题,当excel导入不成功时,优先考虑对应的包没有安装或为成功引用
具体需要导入的包如下
import books as books
import xlrd
import pandas as pd
import numpy as nd
from openpyxl import load_wo
支持一次性导出多个数据源表、自动获取各表的字段名。
支持控制批次的写入速率。例如:每5000行一个批次写入到excel。
支持结构相同的表导入到同一个Excel文件。可适用于经过水平切分后的分布式表。
三、主要实现
A[创建类] -->|方法1| B(创建数据库连接)...
微信公众号(年更选手):数据闲逛人 | Github开源项目:数分/数挖study路线 https://github.com/jc-dian/python_data_analysis
02-23
2使用os.listdir获取文件夹中各表格的名称;
2使用openpyxl循环打开各工作表,并将各工作表表头以外的内容添加到新表中
3保存新表(表格的格式可以打开新表后修改,汇总表格的格式为XLSX类型)
方法很简单很使用,下面是代码和excel图
import os#导入os
from openpyxl import load_workbook,.
results=pd.DataFrame(columns=())
for zhuanye in datas:
datas_zhuanye=datas[datas[“复试专业名称”]==zhuanye]
results=results.append(datas_zhuanye,ignore_index=True)
results.to_excel(“输出结果.xlsx”,index=False)
path = ‘C:/Users/桌面/Desktop/20201218_交易数据’
#os.walk()是一个生成器,返回三个值:根目录,根目录下的目录和文件列表
folder = os.walk(path)
#将返回值转化成列表,
files = list(folder)
file_list = files[0][2]
#这里得到的file_list就是你给的文件夹下面的文件名了
python导出大量数据到csv太慢问题解决
最近项目要求,写了一个定时导出到数据库的数据到csv的脚本(大概每天一千五百万条左右)。
我最开始使用了自带的csv,分批次每次导出一千条,刚开始导出很顺利也很快,每次只需要零点几秒,随着数据处理的越来越多导出的速度就越来越慢,到最后导出一千条需要十几分钟甚至半个小时。
然后我换成了pandas,问题并没有得到解决,也百度了很多发现python并没有很好的解决办法,最后转念一想既然python不行那我就用mysql自带的导出语句啊。(其实这个解决办法有的人可能会
可以使用Python的pandas库将数据库中的数据导出到Excel文件中。首先需要连接数据库并将数据读入到pandas的DataFrame对象中,然后使用to_excel()方法将DataFrame对象导出到Excel文件中。以下是一个示例代码:
import pandas as pd
import pymysql
# 连接数据库
conn = pymysql.connect(host="localhost", user="root", password="password", database="mydb")
# 读取数据到DataFrame对象
df = pd.read_sql("SELECT * FROM mytable", conn)
# 导出到Excel文件
df.to_excel("output.xlsx", index=False)
在上面的示例代码中,需要根据实际情况修改数据库连接参数和SQL查询语句。to_excel()方法的第一个参数是导出的文件名,第二个参数index=False表示不导出索引列。
for j in range(0,length-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
print(alist)