python学习_day4_模块

1.模块基础

  • 在Python中,*.py就可以称之为1个模块(Module)。调用(import)一个模块后会执行其中的所有代码,相当于把这个模块代码放到本文件。
  • 可以使用如下代码查看解释器引用的路径,我们的module要放在这些路径中:
import sys
print(sys.path)

#可以对该list进行修改,实现跨目录导入
1.以相对路径导入
print(__file__) #打印当前脚本文件路径
print(os.path.dirname(__file__)) #打印去掉最后一级目录的当前脚本文件路径
base_path = os.path.dirname(os.path.dirname(__file__)) #再去掉最后一级
sys.path.append(base_path)
2.以绝对路径导入
sys.path.append('E:\\python\\pythonProject\\day2')
  • 模块导入与调用:
import os #导入os中所有方法,使用如下方法调用:
os.mkdir("test")

from os  import mkdir# 导入某个模块下的某个方法
os.mkdir("test")

from module.xx.xx import xx as rename #导入后1个方法后重命令,当名字太长或者名称冲突时可用,重命名后之前的名称不可用

from module.xx.xx import * #导入一个模块下的所有方法,不建议用
#假设
from os import *
#那么在使用os中方法时,就不能os.mkdir(),而是直接mkdir()。os里面有许多函数,若有和自定义函数重名的则造成混淆,调用混乱。

2.开源模块导入

参考:https://zhuanlan.zhihu.com/p/129651314

3.包(python package)

  • 包的跨层级导入
import sys
print(sys.path)  # 查看环境目录
from XX.XX.XX import XX # 一个.表示向下一级目录
  • 每一个包目录下面都有一个__init__.py,只要调用这个包那么这个模块都会执行,一些初始化的功能可写在这里

4.os常用功能

import os
得到当前工作目录: os.getcwd()
返回指定目录下的所有文件名和目录名:os.listdir()
函数删除1个文件:os.remove()
删除多个目录: os.removedirs(r“c: \python”)
检验给出的路径是否是1个文件: os.path.isfile()
检验给出的路径是否是1个目录: os.path.isdir()
判断是否是绝对路径: os.path.isabs()
检验给出的路径是否真地存在:os.path.exists()
返回1个路径的目录名和文件名:os.path.split() 
   e.g
   os.path.split('/home/swaroop/byte/code/poem.txt') 
   结果:
   ('/home/swaroop/byte/code', 'poem.txt')
分离扩展名: os.path.splitext() 
   e.g os.path.splitext('/usr/local/test.py')
   结果: ('/usr/local/test', '.py')
获取路径名: os.path.dirname()
获得绝对路径: os.path.abspath()
获取文件名: os.path.basename()
运行shell命令: os.system()
读取操作系统环境变量HOME的值:os.getenv("HOME")
返回操作系统所有的环境变量: os.environ
设置系统环境变量,仅程序运行时有效: os.environ.setdefault('HOME','/home/alex')
给出当前平台使用的行终止符:os.linesep Windows'\r\n', Linux and MAC'\n'
指示你正在使用的平台: os.name 对于Windows,它是'nt',对于Linux/Unix,它是'posix'
重命名: os.rename(old, new)
创建多级目录: os.makedirs(r“c: \python\test”)
创建单个目录: os.mkdir(“test”)
获取文件属性: os.stat(file)
修改文件权限与时间戳: os.chmod(file)
获取文件大小: os.path.getsize(filename)
结合目录名与文件名: os.path.join(dir,filename)
改变工作目录到dirname: os.chdir(dirname)
获取当前终端的大小: os.get_terminal_size()
杀死进程: os.kill(10884,signal.SIGKILL)

5.sys常用功能

import
sys.path	#获取环境变量
sys.argv  #获取脚本参数

6.时间处理模块

  • 在Python中,表示时间方式:
  1. 时间戳(timestamp) , 表示的是从1970.1. 1. 00:00:00开始按秒计算的偏移量。例:
    1554864776.161901(2019年某日)
  2. 格式化的时间字符串,如“2020-10-03 17:54”
  3. 元组(struct_time)共九个元素。由于Python的time模块实现主要调C库,所以各个平台可能有所不同,
    mac上: time.struct_time(tm_year=2020, tm_mon=4, tm_mday=10, tm_hour=2,tm_min=53, tm_sec=15, tm_wday=2, tm_yday=100, tm_isdst=0),含义如下:
    python学习_day4_模块
  • time模块常用方法:
    python学习_day4_模块
    python学习_day4_模块
    python学习_day4_模块python学习_day4_模块

  • 时间转换图:
    python学习_day4_模块

  • datetime模块


import datetime

# 1.当前时间的操作
print(datetime.datetime.now())  # 格式化返回当前的datetime⽇期
# 输出:2021-04-03 12:48:47.516200
d = datetime.datetime.now()
print(d.timestamp())  # 返回时间戳
print(d.year)  # 返回当前年

# 2.把1个时间戳转为 datetime 日期类型
print(datetime.date.fromtimestamp(3112221122))

# 3.格式化输出时间
print(datetime.datetime(2017, 10, 1, 12, 53, 11, 821218))
# 输出: 2017-10-01 12:53:11.821218

# 4.时间运算,必须用 datetime.timedelta
print(datetime.datetime.now() + datetime.timedelta(4))  # 当前时间 +4天
print(datetime.datetime.now() + datetime.timedelta(hours=4))  # 当前时间 +4小时

# 5.时间替换(修改)
print(d.replace(year=2999, month=11, day=30))
# 输出:2999-11-30 12:48:47.51620

7. random模块

import random

>>> random.randrange(1,10) #返回1-10之间的1个随机数,不包括10
>>> random.randint(1,10) #返回1-10之间的1个随机数,包括10
>>> random.randrange(0, 100, 2) #随机选取0到100间的偶数
>>> random.random() #返回1个随机浮点数
>>> random.choice('abce3#$@1') #返回1个给定数据集合中的随机字符
'#'
>>> random.sample('abcdefghij',3) #从多个字符中选取特定数量的字符
['a', 'd', 'b']

#随机字符串:
>>> import string
>>> ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
'4fvda1'

#洗牌:
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.shuffle(a)
>>> a
[3, 0, 7, 2, 1, 6, 5, 8, 9, 4]

8.Excel处理模块

import openpyxl
from openpyxl.styles import Font, colors, Alignment

# 对Excel操作时候一定要关闭目标文件
import random
import string

# 创建工作簿
wb = openpyxl.Workbook()
sheet = wb.active

# 给工作表命名
sheet.title = "salary"

# 初始化用到的工作区
row_width = 10
col_width = 8
for row in range(1, row_width):
    sheet.append(range(1, col_width))
col_idx = []
for i in range(ord('A'), ord('G') + 1):  # ord:字符转ASCII
    col_idx.append(chr(i))  # 与ord相反
    # print(col_idx)

sheet['A1'] = "姓名"
sheet['B1'] = "邮箱"
sheet['C1'] = "基本工资"
sheet['D1'] = "扣税"
sheet['E1'] = "五险一金扣除"
sheet['F1'] = "奖金"
sheet['G1'] = "实际工资"

for i in range(2, sheet.max_row + 1):
    sheet.cell(row=i, column=1).value = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))

for i in range(2, sheet.max_row + 1):
    sheet.cell(row=i, column=2).value = "rx8477@qq.com"  # 可以是字符串
    # sheet.append() # Value must be a list, tuple, range or generator, or a dict.

for i in range(2, sheet.max_row + 1):  # 基本工资
    sheet.cell(row=i, column=3).value = random.randrange(15000, 20000)
for i in range(2, sheet.max_row + 1):  # 扣税
    sheet.cell(row=i, column=4).value = sheet.cell(row=i, column=3).value * 0.05
for i in range(2, sheet.max_row + 1):  # 扣五险一金
    sheet.cell(row=i, column=5).value = sheet.cell(row=i, column=3).value * 0.15
for i in range(2, sheet.max_row + 1):  # 奖金
    sheet.cell(row=i, column=6).value = random.randrange(2000, 5000, 1000)
for i in range(2, sheet.max_row + 1):  # 实际工资
    sheet.cell(row=i, column=7).value = sheet.cell(row=i, column=3).value + sheet.cell(row=i, column=6).value \
                                        - sheet.cell(row=i, column=4).value - sheet.cell(row=i, column=5).value
# 声明样式
bold_itatic_15_font = Font(name='等线', size=15, italic=False, color=colors.BLUE, bold=True)  # 声明样式
sheet.font = bold_itatic_15_font  # 给单元格设置样式
# 设置B1中的

# 所有⾏⾼、列宽设置.数据垂直居中和⽔平居中
for i in range(1, row_width):
    sheet.row_dimensions[i].height = 20
for i in col_idx:
    sheet.column_dimensions[i].width = 20

# 将所有单元格内容居中
for i in col_idx:
    for j in range(1, row_width):
        idx = f"{i}{j}"
        # print(idx)
        sheet[idx].alignment = Alignment(horizontal='center', vertical='center')

# 遍历 所有数据四舍五入为整数
for row in sheet.iter_rows(min_row=2, max_row=row_width-1, min_col=3, max_col=col_width-1):
    for cell in row:
        # print(cell.value, end="\t")
        cell.value = round(int(cell.value))

# 按行遍历 输出所有内容
# for row in sheet.rows:
#     for cell in row:
#         print(cell.value, end="\t")
#     print()
#
# # 按列遍历 输出所有内容
# for column in sheet.columns:
#     for cell in column:
#         print(cell.value, end=",")
#     print()
#
# # 坐标化 输出第1列内容
# for i in range(1, sheet.max_row + 1):
#     val_in_col1 = sheet.cell(row=i, column=1).value
#     print(val_in_col1)
#
# # 遍历 从第2⾏开始⾄第5⾏,每⾏打印1-5列
# for row in sheet.iter_rows(min_row=2, max_row=5,  min_col=1, max_col=5):
#     for cell in row:
#         print(cell.value, end=",")
#     print()
# # 遍历 打印第2-第5列的数据
# for col in sheet.iter_cols(min_col=2, max_col=5):
#     for cell in col:
#         print(cell.value, end=",")
#     print()

# 保存工作表
wb.save("salaries_list.xlsx")

9.邮件发送

  • 例1:发简单的plain纯文本邮件
import smtplib

from email.mime.text import MIMEText  # 邮件正文
from email.header import Header  # 邮件头

# 登录邮件服务器
smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 发件邮箱中的SMTP服务器,端口是465
# 登陆QQ邮箱后在设置->账户->IMAP/SMTP服务查找
smtp_obj.login("tx779@qq.com", "zvplikgguoznbcfi")  
# 括号中对应的是发件邮箱账号、邮箱密码(exchange的授权码,个人邮箱需要发短信获取)

# smtp_obj.set_debuglevel(1) # 显示调试信息
# 设置邮件信息
msg = MIMEText("~...正文....", "plain", "utf-8") # 正文
msg["From"] = Header("发送者", "utf-8")  # 发送者昵称
msg["To"] = Header("接收者", "utf-8")  # 接收者昵称
msg["Subject"] = Header("主题", "utf-8")  # 主题

# 发送,[]中可以有多个目标邮箱,用“,”分隔开
smtp_obj.sendmail("tx@qq.com", ["rx@qq.com"], msg.as_string())
  • 例2:批量发送工资条,工资条是第8节中Excel实例生成的
import openpyxl

import smtplib

from email.mime.text import MIMEText  # 邮件正文
from email.header import Header  # 邮件头

# 加载Excel
wb = openpyxl.load_workbook("salaries_list.xlsx")
sheet = wb.active

# 登录邮件服务器
smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件邮箱中的SMTP服务器,端口是465 在设置->账户->IMAP/SMTP服务查找
smtp_obj.login("tx779@qq.com", "zvplikgguoznbcfi")  # 括号中对应的是发件邮箱账号、邮箱密码(exchange的授权码,需要发短信获取)

# 循环读取Excel
count = 0
table_col_html = '<thead>' #表头开始
for row in sheet.iter_rows(min_row=1):
    count += 1
    if count == 1:
        for col in row:
            table_col_html += f"<th>{col.value}</th>" # th加粗
        table_col_html += "</thead>" # 表头结束
        continue
    else:
        row_text = "<tr>" #开始一行
        for cell in row:
            row_text += f"<td>{cell.value}</td>"
        row_text += "</tr>" #结束一行
        name = row[0].value
        staff_email = row[1].value
        #print(staff_email,name)

    mail_body_context = f'''
        <h3>{name},你好:</h3>
        <p>请查收工资</p>
        <table border = "ipx solid black">
            {table_col_html}
            {row_text}
        </table>   
    '''
    # 设置邮件头信息
    msg = MIMEText(mail_body_context, "html", "utf-8")  # 正文
    msg["From"] = Header("公司", "utf-8")  # 发送者
    msg["To"] = Header(f"{name}", "utf-8")  # 接收者
    msg["Subject"] = Header("工资", "utf-8")  # 主题
    # 发送
    smtp_obj.sendmail("tx779@qq.com",staff_email, msg.as_string())
    print(f"成功发送{name}的工资条")

print("发送完毕!")
上一篇:day4 Spring框架的学习


下一篇:前端面试刷题day4(每日更新前端面试高频考察点)