您的位置是: > 建網站知識 > 公告通知 >
客服中心

把excel文件用Python解析存入sqlite數據庫

點擊次數:更新時間:2017-02-20 09:39 【打印】【關閉】

最近由于工作上的需求 需要使用Python解析excel文件并存入sqlite 就此做個總結
功能:
1.數據庫設計 建立數據庫
2.Python解析excel文件
3.Python讀取文件名并解析
4.將解析的數據存儲入庫

一 建立數據庫

根據需求建立數據庫,建立了兩個表,并保證了可以將數據存儲到已有的數據庫中,代碼如下:

 
import sqlite3def 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 xlrdimport xlwtfrom datetime import date,datetimedef read_excel():# 打開文件workbook = xlrd.open_workbook(r'file.xls')# 獲取所有sheetsheet_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 osdef 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)

 

這就是解析excel文件并存入sqlite的主要代碼 

?

底部線條

7x24小時服務熱線:400-088-0531???13515318674360網站安全檢測平臺

友情鏈接:
魔法元素投注 体彩大乐透手机扫码 腾讯分分彩app 棋牌欢乐麻将辅助器 重庆快乐10分前三走势 北京pk拾开奖现场直播 吉林十一选五最简单技巧 17年重庆时时彩骗局 11选5任选3稳赚方法 优质股票分析方法 江苏快三官方平台 火山小视频能不能赚钱 压大小单双有什么秘诀 手机在线体育直播 六合彩大全 时时彩定位胆是什么 澳洲三分彩可靠吗