01-homework

1.计算出《成都二手房.xlsx》文件中崇州、大邑、都江堰、高新里面房子单价大于10000元/平的二手房数量总数

from openpyxl import load_workbook

#加载本地文件(工作簿)
wb = load_workbook('./成都二手房.xlsx')
#查看所有的工作表
ws = wb.sheetnames
print(ws)

#计数变量
Count = 0
#指定工作表:工作簿[工作表名] --> wb[工作表名]
for name in ws:
    sheet = wb[name]
    # 求出最大行列数
    rows = sheet.max_row
    cols = sheet.max_column
    for i in range(1, cols + 1):
        # 判断第几列为“单价”列
        if sheet.cell(1, i).value == '单价':
            # 此时i的值为单价所在列数
            break
    # 寻找单价列单价超过10000元/平的二手房数量
    for row in range(2, rows + 1):
        cellValue = sheet.cell(row, i).value
        # print(cellValue, type(cellValue))
        if cellValue != None:
            newValue = cellValue.replace('元/平', '').replace(',', '').replace('参考价:', '')
            # print(newValue)
            if 10000 <= int(newValue):
                Count += 1
print(f'二手房单价超过10000元/平的数量为{Count}')

02-xlwt对xls文件的写操作

from xlwt import Workbook
from random import randint


'''注意:不要奢求xlwt能够对一个已经存在的文件进行写操作,
要打开已经存在的文件,先要做加载,加载操作等价于读操作,但是xlwt模块只能写,没有任何读数据能力。
所以说,xlwt只能从0到1进行文件的创建与写操作。
'''

#1.创建工作簿:Workbook()
wb = Workbook()

#2.创建工作表:add_sheet()
#注意:xlwt模块理解为你创建了某个表就是为这个表写内容
ws = wb.add_sheet('期末成绩')

#3.写入内容
title = ['姓名', '数学', '语文', '英语']
#write(行号,列号,内容) --> 行号和列号从0开始
for i in range(len(title)):
    ws.write(0, i, title[i])

names = ['关羽', '张飞', '赵云', '马超', '黄忠']
for nameIndex in range(len(names)):
    ws.write(nameIndex + 1, 0, names[nameIndex])
    for colIndex in range(1, 4):
        ws.write(nameIndex + 1, colIndex, randint(0, 100))
#保存工作簿
#确保工作簿中存在至少一个工作表,xlwt模块默认不会生成,需要自己创建
wb.save('一年级一班考试成绩.xls')

03-xlrd模块读取xls模块

from xlrd import open_workbook

#1.加载已存在工作簿:open_workbook()
wb = open_workbook('一年级一班考试成绩.xls')

#2.获取所有工作表的名字:sheet_names()
sheetList = wb.sheet_names()
print(sheetList)

#3.指定工作表
#方式一:通过工作表名指定:sheet_by_name
sheet1 = wb.sheet_by_name('期末成绩')
#方式二:通过下标指定:sheet_by_index
sheet2 = wb.sheet_by_index(0)
print(sheet1 == sheet2)
print(sheet1, sheet2)

#4.读数据:
#cell(行号,列号) --> 行列号下标是从0开始
#value:获取指定单元格的值
print(sheet1.cell(0, 0))  # text:'姓名'
print(sheet1.cell(0, 0).value)  # 姓名

#5.获取总的行列数:nrows、ncols
rows = sheet1.nrows
cols = sheet1.ncols
print(rows, cols)

#6.读取所有信息
for row in range(rows):
    for col in range(cols):
        print(sheet1.cell(row, col).value)
        # 注意:xls文件使用xlrd读取数据时整型会变为浮点型

注意:
一般在文件读操作后都需要关闭文件;写操作后需要保存关闭文件;因为在文件被操作时是出于占用状态。除非执行关闭操作或者程序结束,否则文件不会被关闭。一般关闭文件使用close方法,保存关闭使用save方法

04-Python发邮件

场景1:每次发邮件,收件人都是同一个人,每次重新选择很费时间或者很繁琐,可以使用Python发送邮件将收件人固定好。

Python发送邮件设计的知识点:
1.两个内置模块:smtplib、email
2.需要了解附件以什么样的形式添加到邮件中(open方法、二进制、字节)
3.什么是授权码
4.能够看懂邮件发送过程中的发送编码(发送成功、发送失败、垃圾邮件等编码编号)
5.什么是smtp协议

如何将python发送邮件实现最大化的简单、简介、便捷
需要会使用python进行文件读写

05-Python发邮件流程

发送一封邮件大致流程:登录、写邮件、发送。

1.登录:

用程序通过邮箱服务器地址连通邮箱服务器,然后借助SMTP协议通过用户名和授权码进行登录。

2.写邮件:

登陆成功以后构造邮件,邮件由发件人、收件人(收件人、抄送人、密送人)、邮件主题、邮件内容(正文、附件)等组成

3.发送:

借助一开始连通好的服务器和登录好的账号密码,在SMTP协议基础上,通过收件人的地址进行邮件的发送。

SMTP协议:
简单邮件传输协议。它是用于从源地址到目标地址的邮件传输规范,通过SMTP协议控制邮件中转的方式。SMTP协议属于TCP/IP协议簇,它可以帮助每台计算机在发送或中转信件的时候找到下一个地址。SMTP服务器就是遵循SMTP协议发送邮件的服务器。其中涉及到SMTP认证,此认证可以使垃圾邮件的发送者没有机会散播垃圾邮件,增加SMTP认证的目的就是为了使用户避免收到垃圾邮件的骚扰。

06-Python发送邮件代码编写

import smtplib

#1.发送人账号
sendAddress = '1766935706@qq.com'
#2.发送人授权码(邮箱中的授权码等同于密码)
password = 'ntjoswtxxnhybcaa'
#3.连通服务器
#465端口就是发送邮件的端口
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
print(server)
#4.登录
loginResult = server.login(sendAddress, password)
print(loginResult)
#(235, b'Authentication successful')
#235响应成功状态码

#常用邮箱服务器,发送邮箱的端口都是465
#新浪邮箱:smtp.sina.com
#搜狐邮箱:smtp.sohu.com
#126邮箱:smtp.126.com
#163邮箱:smtp.163.com
#qq邮箱:smtp.qq.com
####################################################
from email.mime.text import MIMEText

#MIMEText被用来构造邮件消息,但是MIMEText不能够添加附件。
#1.构造邮件的正文
#三引号是多行字符串
content = """
尊敬的客户你好:
    你乘坐的火车G1234次列车马上到站,请及时到达指定站台。
"""
#2.将正文添加到邮件消息中
#'plain':子内容的类型,一般邮件的正文类型就是plain,utf-8换句话说就是unicode编码
#msg变量等价于一个邮件消息
msg = MIMEText(content, 'plain', 'utf-8')
#3.构造邮件的发件人、收件人等信息
#发件人
msg['From'] = 'Mr.Fu<1766935706@qq.com>'
#msg['From'] = 'xxx<xxx@qq.com>'
#收件人
msg['To'] = '张三<1766935706@qq.com>;李四<1766935706@qq.com>'
#msg['To'] = 'xxx<xxx@qq.com>'
#有时候会有抄送人、密送人等
#抄送人
msg['Cc'] = 'xxx'
#邮件主题
msg['Subject'] = '铁路12306乘车提醒'
#print(msg.as_string())
####################################################
#发送邮件
#server.sendmail(发件人,收件人,发送的消息)
#发件人需要写登录账号的邮箱地址
#收件人使用列表存放,即列表中的一个元素就是一个收件人
#发送的消息:字符串类型的邮件,msg.as_string()
#将邮件作为字符串
To = ['1766935706@qq.com']
server.sendmail(sendAddress, To, msg.as_string())
print('发送成功')

07-open方法

1.计算机中所有的数据以什么形式存在?
二进制:01

2.字节和二进制的关系
字节=8位二进制数

3.open方法
open(文件,模式,编码方式)
参数一:文件就是本地的一个文件,可以使用open方法打开。
参数二:模式
按照文件打开方式分为:r(只读)、w(只写)、a(追加)
按照打开的类型分为:t(文本类型)、b(字节类型:字节类型就代表二进制数据)
模式就是从两种打开方式种各取一种,任意组合:rt、rb、tr、br、wt、wb、tw、bw等
参数三、编码方式,如果是字节类型打开的,可以不写编码方式;
如果是以文本类型打开的,将编码方式设置为utf-8

#以文本只读模式打开文件
file = open('静夜思.txt', 'rt', encoding='utf-8')
#将文件中内容读出
result = file.read()
print(result)
#关闭打开的文件
file.close()

#再次打开文件
#以字节只读模式打开文件
file1 = open('静夜思.txt', 'rb')
result1 = file1.read()
print(result1)
file1.close()

邮件发送过程中添加的附件需要以二进制的形式进行发送,即附件要先以二进制形式读取,然后进行邮件的构造,发送的收件方再转换回原来的样子。