Python学习五

发送邮件

以往python发送邮件是用smtplib和email模块,但是比较复杂,后面又出现了yagmail,大部分人用这个模块,但是发附件如果是中文,会出现乱码情况,这里使用yamail模块实现邮件发送,以qq邮箱为例:

import yamail
smtp = yamail.SMTP(host= 'smtp.qq.com',  # 邮箱服务器
       user='■■■■■■■■■■@qq.com',  # 邮箱账号
       password='■■■■■■■■■■■■■'  # 如果是163、qq等邮箱,填授权码,公司邮箱填密码
       )

# 发送给单人:
smtp.send(to='aa@qq.com',,  # 收件人
          subject='你好,请查收附件',  # 主题
          cc='bb@qq.com',  # 抄送人,无需抄送就不写改字段
          contents='邮箱正文',  # 邮箱正文
          attachments='附件.txt'  # 附件
       	  )
       
# 发送给多人:       
smtp.send(to=['aa@qq.com','bb@qq.com','cc@qq.com'],  # 收件人,发送给多人写成list
          subject='你好,请查收附件',  # 主题
          cc=['dd@qq.com','ee@qq.com','ff@qq.com'],  # 抄送人,发送给多人写成list
          contents='邮箱正文',  # 邮箱正文
          attachments=['附件1.txt','附件2.txt']  # 附件,发送多条附件写成list
          )

异常处理

try/except

python中经常会遇到语法错误和异常,遇到这种情况python就会停止运行,这个时候就可以用try/except语句来捕捉异常,并且发生异常后还可以继续往下执行代码,一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。示例:

import traceback
try:
    2/0    
except TypeError:
    print('出错了')
except ZeroDivisionError:
    print('除数不能为0')

输出结果为:
除数不能为0
ZeroDivisionError: division by zero

如果不能预先确定错误类型的话,可以用EBaseException,BaseException表示所有异常的基类。用traceback.format_exc()可以查看详细的异常信息。

try:
    2/0
except BaseException as e:
    print('错误信息1:', e)
    print('错误信息2:', traceback.format_exc())

输出结果为:
错误信息1: division by zero
错误信息2: Traceback (most recent call last):
  File "E:/Users/Administrator/PycharmProjects/■■■■■■■■", line 9, in <module>
    2/0
ZeroDivisionError: division by zero

try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。else 子句将在 try 子句没有发生任何异常的时候执行。

try:
    1 + 1
except TypeError as:
    print('出错了')
except ZeroDivisionError:
    print('除数不能为0')
else:
    print('没有异常')

输出结果为:
没有异常

try-finally

try-finally语句无论是否发生异常都将执行最后的代码。

try:
    1 + 1
except TypeError as:
    print('出错了')
except ZeroDivisionError:
    print('除数不能为0')
else:
    print('没有异常')
finally:
	print('aaa')
	
输出结果为:
没有异常
aaa

Excel处理

写Excel

python写入表格需要用到xlwt模块,所以先安装xlwt模块。

import xlwt
stus = [
    [1, '张三', 'beijing', 19],
    [2, '李四', 'shanghai', 28],
    [3, '王五', 'shanghai', 16],
    [4, '赵六', 'shanghai', 21]
    ]

stus.insert(0, ['编号','姓名','地址','年龄'])  # 插入表头
book = xlwt.Workbook()
sheet = book.add_sheet('sheet1')
for row, stu in enumerate(stus):  # 控制行
    for col, s in enumerate(stu):  # 控制列
        sheet.write(row, col, s)
ages = [s[-1] for s in stus if type(s[-1]) != str]
avg_age = round(sum(ages) / len(ages),2)
content = '平均年龄:{}'.format(avg_age)
sheet.write(row+1, 0, content)

book.save('students.xlsx')

写入的表格为:
在这里插入图片描述

读Excel

python读取表格需要用到xlrd模块,所以先安装xlrd模块。

import xlrd
book = xlrd.open_workbook('students.xlsx')

# sheet = book.sheet_by_index(0)
sheet = book.sheet_by_name('sheet1')
print(book.sheets())  # 所有的sheet页,返回的是一个list,list里面就是每个sheet对象

for s in book.sheets():
    print(s.row_values(2))  # 获取第三行的数据

print(sheet.cell(0,0).value)   # 获取第一个单元格的数据

print(sheet.row_values(0))  # 获取第一行的数据
print(sheet.row_values(1))  # 获取第二行的数据

print(sheet.col_values(0))  # 获取第一列的数据
print(sheet.col_values(1))  # 获取第二列的数据

print(sheet.nrows)  # 打印行数
print(sheet.ncols)  # 打印列数

输出结果为:
[<xlrd.sheet.Sheet object at 0x00000188099A31F0>]
[2.0, '李四', 'shanghai', 28.0]
编号
['编号', '姓名', '地址', '年龄']
[1.0, '张三', 'beijing', 19.0]
['编号', 1.0, 2.0, 3.0, 4.0, '平均年龄:21.0']
['姓名', '张三', '李四', '王五', '赵六', '']
6
4

修改Excel

python修改表格需要用到xlutils模块,所以先安装xlutils模块。

from xlutils import copy
import xlrd

book = xlrd.open_workbook('students.xlsx')
sheet = book.sheet_by_index(0)

new_book = copy.copy(book)  # copy工作表
copy_sheet = new_book.get_sheet(0)  # copy读到的sheet

for row in range(1, sheet.nrows-1):
    addr = sheet.cell(row, 2).value
    addr = addr.replace('beijing', '北京').replace('shanghai', '上海')  # 修改beijing和shanghai为北京、上海
    copy_sheet.write(row, 2, addr)

new_book.save('students.xlsx')

操作数据库

连接数据库

操作数据库需要安装对应的连接数据库的模块,以mysql为例:

import pymysql
connect = pymysql.connect(host=host,
                user=user,
                password=password,
                db=db,
                port=port
                )

host = ‘■■■■■■■■■■’ # 填写数据库的host地址
user = ‘■■■■■■’ # 连接数据库的用户名
password = ‘■■■■■■’ # 密码,str类型
db = ‘■■■■■’ # 库名
port = ■■■■ # 端口号,int类型

建立游标

以下两种方式都可行

cur1 = connect.cursor()
cur2 = connect.cursor(pymysql.cursors.DictCursor)  # 以字典形式
print(cur1)
print(cur2)

输出结果为:
<pymysql.cursors.Cursor object at 0x00000000006F2790>
<pymysql.cursors.DictCursor object at 0x0000000000747AC0>

执行sql语句

sql语句写在cur.execute()中:

cur.execute('insert into students (id,name,sex,age,addr) values (1,"张三","男","19","北京");')  # 增加学生信息
cur.execute('delete from students where id=50 ;')  # 删除学生信息
cur.execute('select * from students limit 5;')  # 查询学生信息
cur.execute("update students set name = '张三2', sex = '女', age = 18, addr = '北京' where id = 1;")  # 修改学生信息

提交执行结果

执行完sql语句之后需要提交,两种方法,一种是在连接数据库时设置自动提交,一种是写提交代码

connect = pymysql.connect(host=host,
                user=user,
                password=password,
                db=db,
                port=port,
                autocommit=True  # 在连接数据库时设置自动提交
                )
                
cur.execute("update students set name = '张三2', sex = '女', age = 18, addr = '北京' where id = 1;")
connect.commit()  # 在执行sql语句后加上这段表示提交

查询数据

python中有以下几种查询方法:

cur.execute('select * from students;')
print('fetchone', cur.fetchone())  # 取第一条结果
print('fetchmany', cur.fetchmany(2))  # 取前2条结果,这里数字填多少就取多少
print('fetchall', cur.fetchall())  # 拿到所有的结果,二维数组

输出结果为:
fetchone (1, '张三2', '女', 18, '北京')
fetchmany ((1, '张三2', '女', 18, '北京'), (2, '李四', '男', 28, '上海'))
fetchall ((1, '张三2', '女', 18, '北京'), (2, '李四', '男', 28, '上海'), 
		  (3, '王五', '男', 16, '上海'), (4, '赵六', '男', 21, '上海')

注意:这三种方法不要一起用,否则前面的取到数据后,后面的就取不到了

关闭连接

最后,最重要的,使用完数据库后要关闭连接。

cur.close()  # 关闭游标对象
connect.close()  # 关闭数据库连接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值