python之利用嵌套列表解析将sql查询结果同时写excel和txt文档

继昨晚写了一个利用列表推导式及嵌套列表写excel后,今天有写了一个从数据库中查询出结果,然后写入excel和txt中,主要的难点是利用嵌套列表继续,在一条语句中实现。折腾了老半天,终于实现,现将代码记录如下,并做简单分析。


#!/usr/bin/env python
#!/usr/bin/python3
#coding=utf-8
#pip3 install xlsxwriter,自动下载安装 xlsxwriter 模块
import pymssql
import xlrd
import sys
import xlsxwriter
import decimal  ##因为查询结果中,可能存在数值和时间类型的值,所以需要引入下面这三个模块
from decimal import Decimal
import datetime

conn = pymssql.connect(server="192.168.1.151",port="1433",user="sa",password="123456", database="tmp",charset="UTF-8")
cursor = conn.cursor()

sql_str="""
select top 10 * from TABLE1
"""
cursor.execute(sql_str)
data=cursor.fetchall()

workbook2007 = xlsxwriter.Workbook('DSE_WR_W_DAY.xlsx') #创建目标excel表格
worksheet2007 = workbook2007.add_worksheet()
fw=open('DSE_WR_W_DAY.txt','w')
format = workbook2007.add_format({'border':1})
 
#同时输出到excel和txt
[[[[worksheet2007.write(i,j,str(value),format),fw.write(str(value)),fw.write('\t')] for j,value in enumerate(value_r)] ,fw.write('\n')]  for i,value_r in enumerate(data)]
workbook2007.close()
fw.close()


print ('excel创建完成')




下面对主要的代码进行简单分析,为了更清晰的理解,将列表推导的一行语句进行了换行。
在列表推导中,最后(最下面)的for语句,相当于最外层的循环,最前面(最上面)就相当于最内层的循环。
当然一下脚本还存在一些问题待完善,比如txt最后会多余的写入了一个制表符,另外也没有处理None值

[
    [
        [
            [worksheet2007.write(i,j,str(value),format),fw.write(str(value)),fw.write('\t')] #注意在写入txt是,需要将值字符串化。
            #上面个列表中有三个值:第一个值是写excel操作,一次写一个单元格;第二个值是写txt操作,一次写入一个字段值;第三个值是想txt写入一个制表符,紧跟在写完一个字段值后
            for j,value in enumerate(value_r) #里相当于第二层循环的入口和条件。使用enumerate枚举行数据中的每一个字段,并带有序号,相当于一个单元格,j存储列序号,value存储字段值
        ]#这里是第三层中括号,是内层循环中,第二个列表推导式的语法要求,里面也只有一个元素,即内层循环
        ,fw.write('\n')  #在一行数据写完后,写入一个行符。这里还是第一层循环,但是在第二层循环执行完轮后,才执行的这个写文本换行符操作。
    ] #第二层中括号,这个列表中有两个元素,一个是内层循环,一个是想txt写入换行符。然后这个列表中只有一个元素,即只有内层循环,没有写换行符,则可以省略这一层中括号
    for i,value_r in enumerate(data)  #data是从数据库中查询到的数据集合,它是一个嵌套了元组的列表,整个列表是一个数据集,其中的每一个元组就是行数据。例如:[(0,0),(0,1),(1,0),(1,1)]
    #通过enumerate枚举出集合中的每一行及行号,i存储行号,value_r存储行数据,即一个元组。
] #这是最外层的中括号,是列表推导式的语法要求。整个大循环就是一个列表,其中只有一个元素,就是这个大循环



最后在说下这个查询返回的结果集类型,一个嵌套了元组的列表。例如:[(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]

这个类型用非常的精妙,首先中整个列表表示一个查询结果集,列表中的每一个值,就相当于一行,由随着查询条件的改变或表数据的增减,行数在变化,所以用列表表示集合,列表值表示行,最合适不过。
其次,列表中的值,使用的是元组。注意,元组是不可修改的。在表结构不发送变化的情况下,每次查询得到的列数是不会变的。所以这里使用元组来存储每一行中的多个列值,也是再合适不过的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值