Python解析excel文件存入sqlite数据库的方法

yipeiwu_com7年前Python基础

一、建立数据库

根据需求建立数据库,建立了两个表,并保证了可以将数据存储到已有的数据库中,代码如下:

import sqlite3

def createDataBase():
cn = sqlite3.connect('check.db')

cn.execute('''CREATE TABLE IF NOT EXISTS TB_CHECK
(ID integer PRIMARY KEY AUTOINCREMENT,
NUMBER INTEGER,
ITEM TEXT,
REFERENCE TEXT,
SUMMARY TEXT,
OBJECT TEXT,
METHOD TEXT,
CONDITION TEXT,
VALUE TEXT,
RESULT TEXT,
SCORE TEXT,
REMARKS TEXT,
PROVINCE TEXT,
TIME TEXT);''')

cn.execute('''CREATE TABLE IF NOT EXISTS TB_SCORE
(ID integer PRIMARY KEY AUTOINCREMENT,
PROVINCE TEXT,
TIME TEXT,
FILETYPE TEXT,
SCORE INTEGER);''')

if __name__ == '__main__':
createDataBase()

二、使用Python解析excel

Python中的xlrd模块用来解析excel。

相关功能介绍如下:

1. 导入

import xlrd

2. 读取数据

data = xlrd.open_workbook('file.xls')

3. 功能

(1) 通过索引获取

table = data.sheet()[0]
table = data.sheet_by_index(0)

(2)通过名称获取

table = data.sheet_by_name(u'sheet1')

(3)获取整行和整列的值(数组)

table.row_values(i)
table.col_values(i)

(4)获取行数和列数

nrows = table.nrows
ncols = table.ncols

(5)循环行列表数据

for i in range(nrows):
print table.row_values(i)

(6)单元格

cell_A1 = table.cell(0,0).value

(7)使用行列索引

cell_A1 = table.cell(0,0).value

练习代码:

import xlrd
import xlwt
from datetime import date,datetime

def read_excel():
# 打开文件
workbook = xlrd.open_workbook(r'file.xls')
# 获取所有sheet
sheet_name = workbook.sheet_names()[0]
sheet = workbook.sheet_by_name(sheet_name)

#获取一行的内容
for i in range(6,sheet.nrows):
for j in range(0,sheet.ncols):
print sheet.cell(i,j).value.encode('utf-8')

if __name__ == '__main__':
read_excel()

三、Python读取文件名并解析

为了将各个文件的数据加以区分,需要将文件名中标志性字段入库,解析文件的代码如下:

import os

def getFileList(dir,wildcard,recursion):
 os.chdir(dir)

 fileList = []
 check_province = []
 check_time = []
 file_type = []

 exts = wildcard.split(" ")
 files = os.listdir(dir)
 for name in files:
  fullname=os.path.join(dir,name)
  if(os.path.isdir(fullname) & recursion):
   getFileList(fullname,wildcard,recursion)
  else:
   for ext in exts:
    if(name.endswith(ext)):
     fileList.append(name)
     check_province.append(name.split('-')[1])
     check_time.append(name.split('-')[0])
     file_type.append(name.split('-')[2])
 return fileList,check_time,check_province,file_type

在接下来的使用中 会遇到编码问题 所以在使用这些字段时需要先转码,编写转码函数如下:

#转码函数
def changeCode(name):
   name = name.decode('GBK')
   name = name.encode('UTF-8')
   return name

四、解析excel文件并将其存储到sqlite

Python连接数据库 选取了Python自带的sqlite数据库 相对简单 在此不做太多介绍 如果大家对Python操作sqlite有疑惑的话 个人推荐菜鸟教程~

下面是解析excel文件并存入数据库,其中包含了判断单元格内容:

def readExcel(filename,cn,check_province,check_time,FileType):
 #读取
 workbook = xlrd.open_workbook(filename)
 # 获取sheet
 sheet_name = workbook.sheet_names()[0]
   sheet = workbook.sheet_by_name(sheet_name)

 check_Item = 'a'

 itemCount = 0
 score = 0

 second = sheet.cell(7,1).value.encode('utf-8')

 for i in range(7,sheet.nrows):
  if sheet.cell(i,1).value.encode('utf-8') == second:
   check_Item = sheet.cell(i,0).value.encode('utf-8')
   continue

  temp = []
  for j in range(0,sheet.ncols):
   temp.append(sheet.cell(i,j).value.encode('utf-8'))

  answer = sheet.cell(i,7).value.encode('utf-8')

  if answer == "yes" or answer == "no":
   score = score + 1

  if answer == "other":
   print "!!!Failed to import'%s'" % (filename)
   print "!!!Please Choose an Right Answer for '%s'--------"%(filename)
   break
  else:
   cn.execute("insert into TB_CHECK (ITEM,FIELD,TYPE,CONTENT,"
      "ATTRIBUTE,CHECKPOINT,REMARKS,ANSWER,DESCRIPTION,"
      "SUGGESTION,PROVINCE,TIME,STYLE) "
      "values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"
      ""%(temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],check_province,check_time,check_Item))

   itemCount = itemCount + 1
 if itemCount != 0:
  score = round(score * (100 / itemCount), 2)
  cn.execute("insert into TB_SCORE (PROVINCE,TIME,FILETYPE,SCORE) "
    "values('%s','%s','%s','%.2f')"%(check_province,check_time,FileType,score))
  print "Successful for'%s'--------" % (filename)
 cn.commit()

整合上述功能:

def importData(path):
 # 数据库
 createDataBase()
 database = sqlite3.connect("check.db")

 #文件类型
 wildcard = ".xls"

 list = getFileList(path,wildcard,1)

 nfiles = len(list[0])
 #文件名
 file = list[0]
 #时间
 time = list[1]
 #省份
 province = list[2]
 # #文件类型
 FileType = list[3]

 for count in range(0,nfiles):
  filename = file[count]
  check_province = changeCode(province[count])
  check_time = time[count]
  File_type = changeCode(FileType[count])
  readExcel(filename,database,check_province,check_time,File_type)

if __name__ == '__main__':
 if len(sys.argv) != 2:
  print "Wrong Parameters"
 else:
  path = sys.argv[1]
  importData(path)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能有所帮助,如果有疑问大家可以留言交流。

相关文章

浅谈解除装饰器作用(python3新增)

一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。 假设装饰器是通过 @wraps 来实现的,那么你可以通过访问 wrapped 属性来访问原始函数: &g...

Python中endswith()函数的基本使用

函数:endswith() 作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型 相关函数:判断字符串开头 startswith() 一、函数说明 语法:string.en...

windows系统下Python环境搭建教程

windows系统下Python环境搭建教程

windows系统下Python环境的搭建 step1:下载Python程序 https://www.python.org/downloads/release/python-351/...

Python二维码生成库qrcode安装和使用示例

Python二维码生成库qrcode安装和使用示例

二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明。现随着智能手机的普...

给我一面国旗 python帮你实现

给我一面国旗 python帮你实现

本文实例为大家分享了Python之给我一面国旗的具体代码,供大家参考,具体内容如下 1、“给我一面国旗@微信官方” 今天“给我一面国旗@微信官方”刷爆了朋友圈,我也蹭波热度,出个Pyth...