熱線電話:13121318867

登錄
首頁精彩閱讀Python解析excel文件存入sqlite數據庫的方法
Python解析excel文件存入sqlite數據庫的方法
2017-08-12
收藏

Python解析excel文件存入sqlite數據庫的方法

最近工作中遇到一個需求,需要使用Python解析excel文件并存入sqlite,本文就實現的過程做個總結分享給大家,文中包括數據庫設計、建立數據庫、Python解析excel文件、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能有所幫助


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢