目录
发送邮件
以往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() # 关闭数据库连接