python基础入门自学——20--excel与数据库联合使用——工作实践项目(代码片段)

kaoa000 kaoa000     2022-12-13     422

关键词:

先对Python操作Excel做进一步的介绍。测试表数据:

 

选择某一列数据:使用sheet['A:A']形式

结果如下:

(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>, <Cell 'Sheet1'.A5>, <Cell 'Sheet1'.A6>, <Cell 'Sheet1'.A7>, <Cell 'Sheet1'.A8>)
 是一个元组,元组的元素为列中每一行的数据,是单元格对象。关注的重点是这个元组的长度,即选择数据的范围:

 选择多列:ws['A:B']  

 结果为:

((<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>, <Cell 'Sheet1'.A5>, <Cell 'Sheet1'.A6>, <Cell 'Sheet1'.A7>, <Cell 'Sheet1'.A8>), (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.B6>, <Cell 'Sheet1'.B7>, <Cell 'Sheet1'.B8>))

元组套元组,每一列的所有单元格组成一个内层元组的元素,有几列,就有几个内层元组。

选择一个工作表的全部单元格的值:ws.values

前面学过得到一个单元格的值是先获得单元格对象,然后使用value属性,即ws['A1'].value

整个工作表的数值用:ws.values,得到一个全部值的生成器

以一行数据位一个元组,有多少行就有多少个元组。也是元组套元组。

 获取所有行数据,一行的各列单元格组成一个元组,ws.rows,其与ws.values结果类似,只是这里是获得的单元格对象。

 获取所有列的数据,是一列中的所有行数据组成一个元组。ws.columns

上面的都是获取全部数据单元格,如果想获取一个指定区域的单元格:

使用ws.iter_rows()返回多行
使用ws.iter_cols()返回多列

 min_row,min_col确定区域的左上角单元格,max_row,max_col确定右上角,min可以不设置,缺省就是从A1开始。最关键的是value_only参数,缺省是false,即取的是单元格对象,如果设为True,就取值。

 

 Python使用数据库,创建表

主要是创建表的SQL语句的形成。创建表的SQL语句:

create table [schema].tablename(
column1 datatype [primary key] [not null],
...
)
tablespace tablespacename

1、直接写SQL语句执行:

 创建表的语句是直接写在程序中的。

2、拼接组合语句。

3、与Excel表结合,创建数据库表。

实践项目:

 实际中使用的一个系统非常庞大复杂,其给出的查询功能只是简单的原始数据展示,现在想建一个数据库,将自己需要的一些数据导入其中,做自己想要的分析,第一步就是建立相应的数据库表。现在有这个系统的数据表的字典,格式大体如下:

现在想根据这个表来创建数据库表。

如果只是创建几个简单的表,用不着编程实现,现在的实际情况是,这个系统的数据库表超过了2000+,表中的字段数,大体看了一下,有很多表的字段数量到了400+ ,平均字段数在三四十的样子,就是只创建二三十个表,手写SQL语句也很要命,于是编程实现。

模拟数据:将真实表的前四列做修改,做数据分析,只需要导入数据,不需要生成,字段属性一列就不处理,这应该是一个外键,不在新建的表中体现。

 难点是怎么根据这个excel表形成一个完整准确的create table语句。

思路:要想直接通过Excel表来形成SQl语句,难度很大,我考虑很久没有好的实现方法,于是,先对Excel表进行处理,形成一个有利于SQl语句拼接的格式,我使用字典。

根据excel表,形成一个字典,字典的键就是(表名,表名说明),值是一个列表list,列表的元素是一个list。

在根据这个字典形成SQL语句。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import openpyxl
import cx_Oracle

con = cx_Oracle.connect('ehr','ehr','192.168.71.132/orclzdy')
curs = con.cursor()

destfile = '测试表.xlsx'
wb = openpyxl.load_workbook(destfile)
ws = wb['Sheet2']

for row in ws.iter_rows(min_row=2,values_only=True):    # 演示一个row的内容,不是必须的
    print(row)

dict_table = 
for row in ws.iter_rows(min_row=2,values_only=True):    #从表的第2行开始取数据,一行为一个元组,每一列的值是这个元组的元素
    key_tmp = tuple([row[0],row[1]])        #形成一个元组,做字典的键,如第一个表的键就是('TABLE1','表1中文说明')
    if key_tmp in dict_table.keys():
        dict_table[key_tmp].append([])  #如果这个键在dict_table字典中存在,说明不是表的第一个字段,
                                        # 先在键值对的值,即[[],[]]...]形式中增加一个空列表,作为新字段的容器。
        end_index = len(dict_table[key_tmp]) - 1    # 找到刚添加的空列表在外层列表的索引位置
        dict_table[key_tmp][end_index].append(row[2])  # 添加字段名
        dict_table[key_tmp][end_index].append(row[3])  # 添加字段说明
        dict_table[key_tmp][end_index].append(row[4])  # 添加数据类型
        if row[6] =='' or row == None:
            dict_table[key_tmp][end_index].append('')     # 如果excel第7列为空,添加‘’
        else:
            dict_table[key_tmp][end_index].append(' primary key')  # 如果excel第7列不为空,即为主键,添加‘ primary key’

        if row[7] =='' or row == None:                   # 同上,判断是否添加 ‘ not null',注意前面都有一个空格
            dict_table[key_tmp][end_index].append('')
        else:
            dict_table[key_tmp][end_index].append(' not null')
        continue                                         # 处理完一个字段,继续循环下一个字段

    dict_table[key_tmp] = [[row[2],row[3],row[4]],]       # 如果key_tmp这个键在dict_table字典中不存在,那就是一个新表的第一个字段
                                                          # 直接在字典中添加这个键,同时要添加第一个字段的相关信息
    if row[6] == '' or row == None:
        dict_table[key_tmp][0].append('')
    else:
        dict_table[key_tmp][0].append(' primary key')
    if row[7] == '' or row == None:
        dict_table[key_tmp][0].append('')
    else:
        dict_table[key_tmp][0].append(' not null')

print(dict_table)     # 看一下最后形成的字典,不是必须的

# 先查询一下当前数据库的表
curs.execute("select table_name from user_tables")
result = curs.fetchall()
print("执行语句前的表-----start")
for row in result:
    print(row)
print("执行语句前的表-----end")
# 下面遍历dict_table字典,拼接组成SQl语句,并执行
for k,v in dict_table.items():
    sql = 'create table ' + k[0] + '('
    i = 0
    for vv in v:
        i += 1
        if i < len(v):
            sql = sql + vv[0] + ' ' + vv[2] + vv[3] + vv[4] + ','  # 如果不是表的最后一个字段,则最后是一个逗号
        else:
            sql = sql + vv[0] + ' ' + vv[2] + vv[3] + vv[4] + ')'  # 如果是表的最后一个字段,则最后是一个右括号
    sql = sql + ' tablespace users'    # 最后加上表空间
    print(sql)      #查看最后形成的SQL语句
    curs.execute(sql)    # 执行创建表的语句,在数据库中创建表

for k,v in dict_table.items():
    sqlcomm_t = 'comment on table ' + k[0] + ' is ' + "'" + k[1] + "'"  # 给表添加说明
    print(sqlcomm_t)
    curs.execute(sqlcomm_t)
    for vv in v:
        sqlcomm_f = 'comment on column ' + k[0] + '.' + vv[0] + ' is ' + "'" + vv[1] + "'"
        print(sqlcomm_f)
        curs.execute(sqlcomm_f)

curs.execute("select table_name from user_tables")
result = curs.fetchall()
print("执行语句后的表-----start")
for row in result:
    print(row)
print("执行语句后的表-----end")
wb.close()
curs.close()
con.close()

最后的结果:

 

 这个程序只能执行一次,第二次执行因为表已经存在会出错。可以添加一个循环,在建表前,先删除表。

 

 

 

 

人工智能零基础如何自学入门

...道长一、语言希望在进入这个领域之前至少得会一门语言Python。后面可以学学C或者C++,很多源码也是C和C++的二、数学,以及不想做调包侠的话,学通透得有比较好的数学基础:微积分线性代数概率论如果数学基础不好可以先补... 查看详情

自学python入门要买什么书?

文章目录1、《Python编程:从入门到实践》2、《Python编程快速上手让繁琐工作自动化》3、《Python基础教程第3版》4、《Python核心编程(第3版)》5、《Python3网络爬虫开发实战》6、《Python神经网络编程》自学python入门要... 查看详情

python基础入门自学——22--异步io

CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO... 查看详情

python基础入门自学——18--操作excel-工作实践需求(代码片段)

工作中突然要操作一堆Excel表格,就想着能否用Python来处理,这一篇就学习一下Python操作Excel表。我需要在一个内网环境安装python开发环境,在网上下载了pycharm2018,好像再新的版本没有windows32位的版本了。安装... 查看详情

python基础入门自学——21--web开发(代码片段)

B/S架构已经是最流行的开发架构,必须学一学。HTTP协议——在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,... 查看详情

python基础入门自学——19--访问数据库(代码片段)

继续前面的工作需求解决:具体项目3:对于每个单位的考核结果进行分析,如果连续2个月出现红牌,要给与警告,连续3个月及以上的,要处罚,我们要实现的就是给出提示,连续2次出现红牌的月... 查看详情

不容错过,零基础入门python学习路线最佳实践(代码片段)

今天我们来分享零基础入门Python,应该如何自学,自学的路径是怎么样的,内容是从入门到进阶,既有教程,也有经典书籍推荐,还有众多类库介绍,不要错过哦文章目录文档教程Python官方文档廖雪峰... 查看详情

python基础:python入门介绍

文章目录Python入门介绍一、什么是Python?二、Python历史三、学习Python优势四、Python受欢迎的9个原因五、Python的未来六、总结Python入门介绍14天学习训练营导师课程:杨鑫《Python自学编程基础》杨鑫《Python网络爬虫基础》... 查看详情

如何学习python,以及新手如何入门

学习Python主要有自学和报班学习的方式,新手不建议自学,容易没有方向效率低下。python是一门语法优美的编程语言,不仅可以作为小工具使用提升我们日常工作效率,也可以单独作为一项高新就业技能!所以学完Python编程之后... 查看详情

必须收藏零基础自学python资源大全,学完这些自学python学习资料,找工作不用愁

这是一篇Python入门指南,针对那些没有任何编程经验,从零开始学习Python的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。在这个信息爆炸的时代,... 查看详情

编程0基础小白,如何自学python更快、更高效!「方法干货」

参考技术A作为零基础的小白学python,普遍会遇到一个问题:没有找到应用场景。大多数小白在自学一门编程语言时,是没有应用的场景感。说白了,就是不知道学了做什么用,讲不出具体、合理的应用。如果这时候有大佬带着... 查看详情

python自学免费教程-怎样自学python编程?从零开始学习python,python开发入门到精通(代码片段)

我做为千万个零基础自学Python转行程序员的成功案例之一,在自学的过程中,踩过很多坑,整理过很多非常优质的免费资料,对于新手小白来说,这些资料一定可以为你提供参考。如果你是小白,我给你整... 查看详情

有零基础开始自学python的小伙伴吗?怎么样可以快速入门?

参考技术A有人说学习python难度高,其实这种情况是根据学习能力来决定的。对于初学者和完成普通任务,Python语言是非常简单易用的。当然了Python具有丰富库的,想要更高深的学习Python,同样是一件比较困难的事情。我们先来... 查看详情

必须收藏零基础自学python资源大全,学完这些自学python学习资料,找工作不用愁

这是一篇Python入门指南,针对那些没有任何编程经验,从零开始学习Python的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。在这个信息爆炸的时代,... 查看详情

必须收藏零基础自学python资源大全,学完这些自学python学习资料,找工作不用愁

这是一篇Python入门指南,针对那些没有任何编程经验,从零开始学习Python的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。在这个信息爆炸的时代,... 查看详情

零基础程序员自学编程的6种方法,你知道吗?

...P从入门到放弃,C语言从入门到放弃,Java从入门到放弃,Python从入门到放弃...在自学编程的过程中,一部分程序员遇到冰冷的英语字母,枯燥的编程教程,果断选择了放弃。但其实自学编程不是那么难,只要是逻辑思维或者理科... 查看详情

python入门自学进阶-web框架——21djangoadmin项目应用(代码片段)

客户关系管理。以admin项目为基础,扩展自己的项目。一、创建项目二、配置数据库,使用mysql数据库:需要安全mysqlclient模块:pipinstallmysqlclientDATABASES='default':'ENGINE':'django.db.backends.mysql 查看详情

python入门需要学些啥?

Python相对比较简单,零基础也能学。系统学习的话,一般4-6个月左右能学好。建议大家可以从以下三方面来入手:①先自学一些python书籍大家可以从书中了解一些基础知识,建立一些编程认知。但是这样的方式,还是难免会因为... 查看详情