需求:
将若干个excel文件导入到mysql数据库同一表中
作为一个菜鸟,手动降低很多难度
1、拿到这个需求,当然先上网百度啦,发现利用python的xlrd库就可以实行,于是开始安装,是参考这篇文章http://www.360doc.com/content/12/0918/22/9369336_236837182.shtml
代码如下:
#-*-coding:gbk-*-
import xlrd
import re
import sys,os
reload(sys)
sys.setdefaultencoding( "gbk" )
def main():
xlsfile = xlrd.open_workbook("C:\\Python27\\lcc.xls")
try:
mysheet = xlsfile.sheet_by_name("Sheet1")
except:
print("no sheet in %s named Sheet1")
return
print("%d rows,%d cols"%(mysheet.nrows,mysheet.ncols))
nr =int(mysheet.nrows)
nc =int(mysheet.ncols)
for row in range(0,nr):
temp=""
for col in range(0,nc):
if mysheet.cell(row,col).value != None:
temp += str(mysheet.cell(row,col).value)+"\t"
print temp
if __name__ == '__main__':
main()
实现了读取excel文件就成功了一大步啦!
2、利用python连接mysql数据库
首先还是要装一个模块 MySQLdb
装好之后就开始连接啦!
代码如下
#-*-coding:gbk-*-
import MySQLdb
database = MySQLdb.connect (host="localhost", user = "root", passwd = "123456", db = "123",charset="utf8")
# 获得游标对象, 用于逐行遍历数据库数据
cursor = database.cursor()
# 关闭游标
cursor.close()
# 提交
database.commit()
# 关闭数据库连接
database.close()
# 打印结果
print ""
print "Done! "
ps:在连接数据库之后,出现过数据库乱码的情况,找了很多资料才发现是要设置charset="utf8" 才能成功的插入中文,神坑
3、第三步就可以将两个连起来啦:
代码如下:
#-*-coding:gbk-*-
import xlrd
import MySQLdb
import sys,os
import re
#from datetime import datetime
#from xlrd import xldate_as_tuple
reload(sys)
sys.setdefaultencoding( "gbk" )
book = xlrd.open_workbook("C:\\Python27\\lcc.xls")
b1 = 'Sheet1'
sheet = book.sheet_by_name(b1)
database = MySQLdb.connect (host="localhost", user = "root", passwd = "123456", db = "123",charset="utf8")
# 获得游标对象, 用于逐行遍历数据库数据
cursor = database.cursor()
nr = int(sheet.nrows)
nc = int(sheet.ncols)
# 创建插入SQL语句
query = """INSERT INTO work (id, bomc, time, worker, admin, mukuai, ispl, note) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"""
# 创建一个for循环迭代读取xls文件每行数据的, 从第二行开始是要跳过标题
for r in range(1, nr):
id = k[0] +'_' + bytes(sheet.cell(r,0).value) + '_' + sheet.cell(r,1).value
bomc = sheet.cell(r,1).value
#time = sheet.cell(r,2).value
time = k[0]
worker = sheet.cell(r,3).value
admin = sheet.cell(r,4).value
mukuai = sheet.cell(r,5).value
ispl = sheet.cell(r,6).value
note = sheet.cell(r,7).value
values = (id, bomc, time, worker, admin, mukuai, ispl, note)
# 执行sql语句
cursor.execute(query, values)
# 关闭游标
cursor.close()
# 提交
database.commit()
# 关闭数据库连接
database.close()
# 打印结果
print ""
print "Done! "
print ""
columns = str(nc)
rows = str(nr)
print("%d rows,%d cols"%(sheet.nrows,sheet.ncols))
4、那么问题来了,我现在只能对一个excel文件进行操作,怎么样才可以对大量数据进行处理呢?然后我导师就告诉我可以用批处理呀!又开始了解批处理:
test.py E:\File\AI\lcc.xls
**test.py 就是我们的python代码 后面的文件路径就是我们要对其操作的文件,要对多个文件操作只要将那个文件的路径和名字按同样的格式写在一个文件就好啦,然后保存为bat文件,就OK啦!!!
那么问题又来了,我们该怎么根据批处理文件来进行代码里面文件名的改变呢?这时候又是一个新知识啦,利用python的启动参数,具体可以参考这篇文章:http://www.cnblogs.com/likui360/p/5768623.html,简言之就是利用sys.argv[]获取命令行参数,sys.argv[0] 代表的是test.py sys.argv[1] 代表的是文件路径
到现在,问题基本解决了,可以完美的点击bat文件来进行测试啦!!!
附上完整代码:
#-*-coding:gbk-*-
import xlrd
import MySQLdb
import sys,os
import re
reload(sys)
sys.setdefaultencoding( "gbk" )
filename = sys.argv[1]
book = xlrd.open_workbook(filename)
k = re.findall(r'(\w*[0-9]+)\w*',filename)
#这里是利用我文件名字中的日期来进行截取日期字段
if len(sys.argv) == 3:
b1 = sys.argv[2]
else:
b1 = 'Sheet1'
sheet = book.sheet_by_name(b1)
database = MySQLdb.connect (host="localhost", user = "root", passwd = "123456", db = "123",charset="utf8")
#这里user passwd就是你的mysql数据库用户和密码,db就是你要连接的数据库名字
# 获得游标对象, 用于逐行遍历数据库数据
cursor = database.cursor()
nr = int(sheet.nrows)
nc = int(sheet.ncols)
# 创建插入SQL语句
query = """INSERT INTO work (id, bomc, time, worker, admin, mukuai, ispl, note) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"""
# 创建一个for循环迭代读取xls文件每行数据的, 从第二行开始是要跳过标题
for r in range(1, nr):
id = k[0] +'_' + bytes(sheet.cell(r,0).value) + '_' + sheet.cell(r,1).value
bomc = sheet.cell(r,1).value
#time = sheet.cell(r,2).value
time = k[0]
worker = sheet.cell(r,3).value
admin = sheet.cell(r,4).value
mukuai = sheet.cell(r,5).value
ispl = sheet.cell(r,6).value
note = sheet.cell(r,7).value
values = (id, bomc, time, worker, admin, mukuai, ispl, note)
# 执行sql语句
cursor.execute(query, values)
# 关闭游标
cursor.close()
# 提交
database.commit()
# 关闭数据库连接
database.close()
# 打印结果
print ""
print "Done! "
print ""
columns = str(nc)
rows = str(nr)
print("%d rows,%d cols"%(sheet.nrows,sheet.ncols))
总结:做完这个小需求,就觉得python的学习道路路漫漫其修远兮!!!