资讯专栏INFORMATION COLUMN

Python使用第三方库xlrd获取Excel表格中的字段并生成SQL文件

baishancloud / 773人阅读

摘要:之前写过一篇使用脚本生成文件的文章,时隔很久这种终于有空写该库的兄弟库,用来读取文件。

之前写过一篇使用Python脚本生成Excel文件的文章,时隔很久这种终于有空写该库的兄弟库xlrd,用来读取Excel文件。
最近被调到电商项目,由于种种原因(设计不完善、SQL语句书写不规范,甲方太奇葩...槽点太多,就不在这里吐槽了)需要经常进行刷数据操作(批量修改错误数据),一般就是写一写SQL文件来直接操作,但是在进行了反复的ctrl+c和ctrl+v的操作之后,终于决定写一个脚本,直接将Excel文件中需要insert和update读取出来,并生成SQL文件。

项目GitHub地址:https://github.com/sunny0826/...


生成update语句:

#!/usr/bin/env python
#encoding: utf-8
#Author: guoxixi
import xlrd
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def open_excel(file="test.xls"):
    try:
        data = xlrd.open_workbook(file)  # 打开excel文件
        return data
    except Exception, e:
        print str(e)


def excel_table_bycol(file="", where=[0], colindex=[0], table_name="Sheet1"):
    data = open_excel(file)
    table = data.sheet_by_name(table_name)  # 获取excel里面的某一页
    nrows = table.nrows  # 获取行数
    t_name = table.row_values(0)[0].encode("utf8") #表名
    colnames = table.row_values(1)  # 获取第一行的值,作为key来使用
    list = []
    # (2,nrows)表示取第二行以后的行,第一行为表名,第二行为表头
    for rownum in range(2, nrows):
        row = table.row_values(rownum)
        if row:
            whe = {}
            for n in where:
                whe[str(colnames[n]).encode("utf-8")] = str(row[n]).encode("utf-8")  #输入的筛选字段
            app = {}
            for i in colindex:
                app[str(colnames[i]).encode("utf-8")] = str(row[i]).encode("utf-8")  # 将数据填入一个字典中,同时对数据进行utf-8转码,因为有些数据是unicode编码的
            list.append({"where":whe,"app":app})  # 将字典加入列表中去
    return list,t_name


def main(file,where,colindex):
    # colindex为需要更新的列,where为筛选的列
    tables = excel_table_bycol(file,where,colindex, table_name=u"Sheet1")
    with open("./sql_result/update#"+tables[1]+".sql", "w") as f:    # 创建sql文件,并开启写模式
        for info in tables[0]:
            sql_line = "UPDATE "+tables[1]+" SET"
            apps = info.get("app")
            for key,value in apps.items():
                if sql_line.endswith("SET"):
                    sql_line += " "+key+"=""+value+"" "
                else:
                    sql_line += ", " + key + "="" + value + "" "
            sql_line += " WHERE"
            where = info.get("where")
            for key, value in where.items():
                if sql_line.endswith("WHERE"):
                    sql_line += " "+key+"=""+value+"" "
                else:
                    sql_line += "AND " + key + "="" + value + "" "
            sql_line+="
"
            f.write(sql_line)  # 往文件里写入sql语句

if __name__ == "__main__":
    file_name = "test.xls"  # 导入xls文件名
    where = [0,1,2]         # 条件字段
    colindex = [3, 4]       # 需要插入的列
    main(file_name,where,colindex)

在Excel文件中,第一行行需要update的表名,第二行为字段名,每一列为该字段的对应值,这里可以进行where过滤,只需要修改main函数下where数组内的数字即可,需要update的字段同理,执行后就会生成名字为update#表名.sql的SQL文件。


生成insert语句:

#!/usr/bin/env python
#encoding: utf-8
#Author: guoxixi
import xlrd
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def open_excel(file="test.xls"):
    try:
        data = xlrd.open_workbook(file)  # 打开excel文件
        return data
    except Exception, e:
        print str(e)


def excel_table_bycol(file="", colindex=[0], table_name="Sheet1"):
    data = open_excel(file)
    table = data.sheet_by_name(table_name)  # 获取excel里面的某一页
    nrows = table.nrows  # 获取行数
    t_name = table.row_values(0)[0].encode("utf8") #表名
    colnames = table.row_values(1)  # 获取第一行的值,作为key来使用
    list = []
    # (2,nrows)表示取第二行以后的行,第一行为表名,第二行为表头
    list.append(t_name)
    list.append(colnames)
    for rownum in range(2, nrows):
        row = table.row_values(rownum)
        if row:
            app = []
            for i in colindex:
                app.append(str(row[i]).encode("utf-8") )
            list.append(app)  # 将字典加入列表中去
    return list


def main(file_name,colindex):
    # colindex为需要插入的列
    tables = excel_table_bycol(file_name,colindex, table_name=u"Sheet1")
    t_name = tables.pop(0)
    key_list = ",".join(tables.pop(0)).encode("utf8")   #list转为str
    sql_line = "INSERT INTO "+t_name+"("+key_list+")VALUE"
    line = ""
    for info in tables:
        content = ",".join(info)
        if line != "":
            line =line + ",(" + content + ")"
        else:
            line = "("+content+")"
    sql_line = sql_line + line + ";"
    with open("./sql_result/insert#" + t_name + ".sql", "w") as f:  # 创建sql文件,并开启写模式
        f.write(sql_line)  # 往文件里写入sql语句

if __name__ == "__main__":
    file_name = "test.xls"          #导入xls文件名
    colindex = [0, 1, 2, 3, 4]      #需要插入的列
    main(file_name,colindex)

生成insert语句SQL文件的Excel格式与update的相同,但是传入参数方面,因为不需要过滤条件,所以只需要往数组中写入需要插入字段的列数就好。

希望对大家有所帮助^_^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41399.html

相关文章

  • python xlrd 读取excel

    摘要:还有一种特殊的情况,合并单元格的可以查看合并单元格的情况第一行第到列合并第到行第列合并前两个参数指行范围,后两个参数指列范围。合并单元格的内容取值只有合并的第一个单元格可以获取到值,其他为空。 文章链接:https://mp.weixin.qq.com/s/fojkVO-AB2cCu7FtDtPBjw 之前的文章介绍过关于写入excel表格的方法,近期自己在做一个网站,涉及到读取ex...

    chaos_G 评论0 收藏0
  • python实现读取excel表格详解方法

      小编写这篇文章的主要目的,主要是给大家讲解关于python的一些知识,讲解的内容是关于如何读取excel表格的一些详细方法,请大家要仔细阅读哦。  一、python读取excel表格数据  1、读取excel表格数据常用操作  importxlrd   #打开excel表格   data_excel=xlrd.open_workbook('data/dataset.xlsx')...

    89542767 评论0 收藏0
  • 如何利用python读取excel表格?下文给大家详细解答

      小编写这篇文章的一个主要目的,主要就是给大家去做一个解答,接的内容主要是利用python去读取excel表格,那么,怎么才能快速的实现这个操作呢?下面就给大家详细解答下。  一、python读取excel表格数据  1、读取excel表格数据常用操作  importxlrd   #打开excel表格   data_excel=xlrd.open_workbook('data/datas...

    89542767 评论0 收藏0
  • Windows环境 Git提交代码到Github(附:python 读写Excel文件Demo)

    摘要:目录提交代码常用命令读写文件一常用命令从远程仓库克隆整个项目代码列出当前目录所有还没有被管理的文件和被管理且被修改但还未提交的文件提交全部未跟踪和修改文件,但是不处理删除文件将暂存区里的改动给提交到本地的版本库参数表示可以直接输入后面的 目录 Git提交代码常用命令 python 读写Excel文件Demo 一、Git常用命令 git clone #从远程仓库克隆整个项目代码sh...

    Drinkey 评论0 收藏0
  • Python 读写excel文件

    摘要:查找了一下,可以操作表的几个库有以下几个这个是推荐使用的库,可以读写以上格式,以结尾的文件。这个支持读取数据,支持以结尾的文件,也就是比较老的格式。这个和上面的相对应,支持写入书和格式化数据,支持结尾的文件格式。 最近需要用到Python来操作excel表,读取表格内容到数据库。所以就搜索了相关资料。查找了一下,可以操作excel表的几个库有以下几个: openpyxl 这个是推荐使用...

    plus2047 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<