目录:
8包和模块
8.1模块
广义来说一个.py文件就是一个模块。这个文件的名字是:模块名.py。由此可见在python中,文件名和模块名的差别只是有没有后缀。
模块 -> Python文件
分为三种:
系统模块(random functools time)
自定义模块(自己创建的python文件)
三方库文件(需要进行下载安装)
模块之间的内容是可以相互使用的,在使用的时候要先将这个模块进行导入
语法规则:
模块名的命名规范:
满足标识符的组成成分,英文字母是小写的 单词和单词之间使用下划线隔开
import 模块名
使用: 模块名.模块方法
注意:
按模块区分拥有独立的命名空间
from 模块名 import 模块方法1,模块方法2
使用: 模块方法2
注意:只能使用导入的内容
将模块的内容导入到当前的命名空间中,直接使用名字就行. 如果,被导入的模块和当前的文件中有同名的函数,那么后者将会覆盖前者。
from 模块名 import *
使用: 模块方法
注意:*表示的是通配符表示导入除了以 _ 开头的所有变量,但是如果定义了__all__, 那么导入该模块下__a11__ 这个字段中允许导入的内容
模块中有些功能只是为了简化逻辑代码的不是为了对外提供的 像这种*来导入的时候没有必要把这种函数对其进行提供所以设置了__a11__ 这个列表字段, 需要提供什么, 就在这个列表中设置对应的功能名即可
起别名 as
import 模块名 as 另命名
使用: 另命名.模块方法
模块知识盲点:
python中不支持重新加载或卸载之前的导入的模块,因此如果修改被导入的模块,需重新启动python程序或者是使用重新加载语句来实现 import importlib; importlib.reload(modulename) 。
当一个模块被导入时,他的全局变量名__name__ 为模块名,当这个模块当做脚本执行时,全局变量名__name__为 main。
模块的查找顺序:内存中已经加载的模块->内置模块->sys.path路径中包含的模块。(所以我们自己开发模块时,注意不要和已有的模块名重复)
代码示例
8.2下载安装第三方模块
使用到的工具pip ,这个工具在Python环境下有一个文件夹Scripts
pip的一些指令
instal1 下载并安装
download 下载
uninstal1 卸载
list 展示安装过的库文件
search 搜索查询
pip指定版本下载
pip install 三方库==版本号
不知道版本号的情况下, ==后面不用赋值 直接回车就会列出相应的版本 然后选择对应的版本即可
注意:
进行下载的时候默认请求的服务器地址是 https://pypi.python.org/simple 这个是国外的网站, 请求下载比较慢。国内知名的服务器已经把这些工具放在自己的服务器上了,可以在国内的这些服务器上进行下载。
找度娘搜索pip国内镜像源 -> 例如:清华源
下载的时候怎么让这个工具指定国内的下载源
1.临时指定
pip insta11三方库名-i国内镜像源的地址
比如 pip install requests -i https://pypi.douban.com/simple
2.永久指定
1.在磁盘c下的用户(当前登录用户即可)下新建pip文件夹
2.进入pip文件夹,新建一个文本文档,并将其名称及扩展改为“pip.ini”
3.输入如下内容,保存
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
3.Python下载安装
工具栏上File ---- settings ---- project --->- python interpreter ---在设置的python环境下点击+先去
修改下载源 --- manage repositories 把这个里面的下载源编辑成国内的下载源。
关闭这个窗口重新点击+号进入等加载完成就可以搜索安装了
8.3包
包的本质就是一个包含__init__.py文件的目录。是一种通过使用‘.模块名’来组织python模块名称空间的方式,也就是说在在导入包时遇到带 点 的,这就是关于包的导入语法。
项目中的文件夹,这个包中自带__init__.py文件,是包的初始化文件,也是为 了供外界更好的使用或者调用包下面模块的内容。
导入包,本质上是导入了包中的__init__.py文件。
包的导入形式也有,import 和 from…import…两种形式。
作用:
1.增加文件的命名空间[解决同文件夹下不能重名]
2.对python文件进行分类管理
怎么创建包:
在需要创建包的位置选中那个目录右键 -> new -> python package
怎么导入包中模块:
import 一级包名.二级包名2.三级包名3...模块名.方法名 as 另命名
以上方法比较复杂,可以使用__init__.py简化
使用方法: 将包中所有对外开发的方法导入init文件里面即可
import 包名 即可
配合*可以加__all__字段
8.4程序入口.
标记程序入口文件呢? ? ?
根据模块名来决定的
怎么来呈现模块名
__name__获取模块名的,启动文件(运行的那个文件)默认启动的时候会被解释成 main 不再是模块本身的名
import pack.tooLs # 会把模块中的内容先加载执行
所以可以得到设置文件入口方法 => 设置main方法
if __name__ == '__main__':
print("程序入口")
8.5常用系统模块
8.5.1 time模块
提供的了时间的相关操作
epoch --- 时间开始的点 1970年1月1日 00:00:00 用于计算unix时间戳[时间到1970年1月1日凌晨经历的秒数]
1.获取当前时间–时间元组
import time
cur_time = time.localtime()
print(cur_time)
'''
time.struct_time(tm_year=2021, tm_mon=7, tm_mday=27, tm_hour=14,
tm_min=29, tm_sec=21, tm_wday=1, tm_yday=208, tm_isdst=0)
'''
# 通过下标(索引)获取
print(cur_time[0]) # 2021
# 另一种获取方式
print(cur_time.tm_gmtoff) # 28800
2.获取当前时间对应的时间戳
时间戳用浮点数的形式来存储的
import time
seconds = time.time()
print(seconds) # 1627367690.3970532
3.时间格式化
参数: 格式化的样式 时间
import time
time_format = time.strftime('%c', cur_time)
print(time_format) # Tue JuZ 27 14:38:11 2021
time_format = time.strftime(' %Y/%m/%d %H:%M:%S', cur_time)
print(time_format) # 2021/07/27 14:39:45
4.反格式化时间
字符串类型的时间 => 时间类型的数据
import time
# format_time = time.strptime("字符串格式的时间", ' 字符串时间的格式')
format_time = time.strptime('2021-07-26 14:43:12', '%Y-%m-%d %H:%M:%S')
print(format_time)
'''
time.struct_time(tm_year=2021, tm_mon=7, tm_mday=26, tm_hour=14, tm_min=43, tm_sec=12, tm_wday=0, tm_yday=207, tm_isdst=-1)
'''
5. 获取自定义时间对应的时间戳
import time
cus_seconds = time.mktime(format_time)
print(cus_seconds) # 1627281792.0
6.把时间戳转化为时间元组
不给参数默认获取的是当前时间
给了时间戳的参数 获取的就是这个时间戳对应的时间元组
import time
cus_time = time.localtime(1607281792)
print(cus_time)
'''
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=7, tm_hour=3, tm_min=9, tm_sec=52, tm_wday=0, tm_yday=342, tm_isdst=0)
'''
7.时间休眠
import time
time.sleep(5)
# 时间单位是秒
print('睡醒了')
print(time.time())
8.练习
import time
print('*'*20, '时间转换器', '*'*20)
time_str = input("请录入 年-月-日 时:分:秒 这种格式的时间\n>>>")
try:
format_time = time.strptime(time_str, '%Y-%m-%d %H:%M:%S')
cus_seconds = time.mktime(format_time) + 3600*24*3
print("三天后的日期是:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(cus_seconds)))
except Exception as e:
print("日期格式输入有误, 错误码:", e)
8.5.2 datetime模块
比time模块更便捷的是支持时间的数学运算
模块下的时间类型:
datetime 包含了年月日时分秒的时间
date 包含了年月日的时间
time 包含了时分秒的时间
timedelta 时间差的类型
calendar模块
关于日历的
功能代码示例:
1.获取当前时间
import datetime
now = datetime.datetime.now()
print(now, type(now)) # 2021-07-27 15:37:17.700340 <class 'datetime.datetime'>
2.自定义时间
import datetime
cus_date = datetime.date(year=2021, month=7, day=28)
print(cus_date) # 2021-07-28
cus_date = datetime.datetime(year=2021, month=7, day=28)
print(cus_date) # # 2021-07-28 00:00:00
print(datetime.time(13, 22, 10)) # 13:22:10
3.时间格式化
时间对象.strftime(时间对象)
import datetime
print(cus_date.strftime('%Y/%m/%d'))
4.反格式化
import datetime
# datetime .datetime. strptime(字符串时间, 按照哪个格式解析)
dtime = datetime.datetime.strptime('2021-07-28 00:00:00', '%Y-%m-%d %H:%M:%S')
print(dtime)
5.时间差运算
import datetime
# 获得某一时间后例如dtime三天后的时间
new_time = dtime + datetime.timedelta(days=3)
print(new_time)
6.实例:完成倒计时功能
import datetime
# 功能的实现:获取结束的时间 和 当前时间的差值
# 假设活动时间为七夕8月14号
import time
import datetime
now = datetime.datetime.now()
end_time = datetime.datetime(now.year, 8, 14)
t2 = now
while 1:
# 获取当前时间
t1 = datetime.datetime.now()
time.sleep(1.0 - t1.second + t2.second)
# 获取时间差
time_diff = end_time - t1
print(time_diff)
print(
f'活动剩余时间:{time_diff.days}天 {time_diff.seconds // 3600:02d}:{time_diff.seconds % 3600 // 60:02d}:{time_diff.seconds % 60:02d}')
if int(time_diff.total_seconds()) == 0:
print('活动结束')
break
t2 = t1
9.calendar模块
import calendar
# 日历模块
year_new = calendar.calendar(21)
print(year_new)
# 显示某一年某一月的日历
month_calendar = calendar.month(2021, 7)
print(month_calendar)
# 判断是不是闰年
is_leap = calendar.isLeap(2020)
print(is_leap)
# 7两年之间闰年的个数
print(calendar.leapdays(1996, 2021))
8.5.3 math模块
封装的是关于数学函数的操作 api文档 更换math查看不同模块
https://docs.python.org/zh-cn/3.7/library/math.html
该模块提供了对C标准定义的数学函数的访问。
这些函数不适用于复数;如果你需要计算复数,请使用 cmath 模块中的同名函数。
该模块提供了以下函数。除非另有明确说明,否则所有返回值均为浮点数。
功能代码简单示例:
import math
print(f'圆周率{math.pi}')
print(f'数学常数{math.e}')
print(f'向上取整{math.ceil(18.3)}') # 向上取整19
print(f'向上取整{math.ceil(-18.3)}') # 向上取整-18
print(f'向下取整{math.floor(-18.3)}') # 向下取整-19
print(f'绝对值{abs(-100)}') # 绝对值100 结果默认是int类型
print(f'绝对值{math.fabs(-100)}') # 绝对值100.0 结果是浮点数
print(f'阶乘{math.factorial(10)}') # 阶乘3628800
print(f'无精度损失对序列求和{math.fsum([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1])}')
print('================================================================')
print(f'无精度损失对序列求和{math.fsum([0.1, 0.1, 0.1])}')
'''
无精度损失对序列求和0.30000000000000004
它计算给定输入的最准确可能总和(即,与输入的精确数学和最接近的精确可表示值)。
它并没有用你原先想到的数字神奇地取代它的输入。
你问math.fsum的行为,就好像是给定的精确值0.1和0.2,但它无法知道这是你想要的方式:它只能在你给它的输入中进行操作
math.fsum旨在除去四舍五入参与求和误差的累积更多于两个浮动。
'''
print(f'求最大公约数{math.gcd(12, 16)}') # 求最大公约数4
# 双层否定 nan -- not a number
print(f'判断某个数据是不是 不是数字{math.isnan(7.8)}') # 判断某个数据是不是 不是数字False
print(f'某个数的开平方 {math.sqrt(4)}') # 某个数的开平方 2.0
print(f'三角函数{math.tan(math.pi/4)}') # 三角函数0.9999999999999999
print(f'弧度转度数{math.degrees(math.pi / 4)}') # 弧度转度数45.0
print(f'度数转弧度{math.radians(90)}') # 度数转弧度1.5707963267948966
复杂的可以参考说明文档
8.5.4 os模块
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块
关于系统的操作
import os
# 获取操作系统简写
print(os.name) # nt windows系统的
# 获取环境变量
print(os.environ) # 公共的
print(os.environ.get('PATH')) # 获取PATH的环境变量
# 获取当前文件所在的绝对路径
路径相关操作
import os
print(os.getcwd())
# E:\实习\21 暑假实习\每天\day11\代码\Day11
# 相对路径
print(os.curdir) # .
创建文件夹
import os
# os.mkdir(路径)
# 只会创建路径的最后一级 a\b\c 只会创建c这个文件夹 如果a和b不存在会报错 如果创建的存在 会报错
os.mkdir(r'.\test')
os.mkdir(r'.\test\subtest')
# 创建多级路径
os.makedirs(r'.\test\subtest')
删除文件夹
— 只能删除最后一级 要求目录是空目录
import os
os.rmdir('./test') # 目录不是空的
os.rmdir('./test/subtest')
# 删除多级 如果直接给的是非空目录 报错
# 如果给的是一个空目录的路径 删除这个目录 检索上一级是否是空的 是的话就删除 直到上一级不是空的 结束删除
os.removedirs('./a/c/d')
创建与删除文件
import os
# 创建文件 open来完成的 利用w写的模式来完成创建的
# open(文件路径,'w/a', 文件的编码格式)
open('./test/demo.txt', 'w', encoding='utf-8')
# 删除文件
os.remove('./test/demo.txt')
获取子文件名
import os
# 获取指定目录下的直接子文件名
filenames = os.listdir('.')
print(filenames)
# ['.idea', 'test1.py', '2.模块的引入方式.py', '3.使用包下的工具文件.py',
# '4.启动文件.py', '5.time模块.py', '6.datetime的模块.py', '7.calendar模块.py',
# '8.math模块.py', '9.os的模块.py', 'a', 'pack', 'test']
其他操作
import os
# 重命名 【1.重命名[路径不变 名字变] 2.剪切[名字不变 路径变]】
os.rename('./test/demo.txt', './test/demo_1.txt')
# 剪切
os.rename('./test/demo_1.txt', './a/demo_1.txt')
8.5.5 os.path内容
os.path都是关于路径的操作
import os
# 获取目录下的直接子文件名
filenames = os.listdir('.')
print(filenames)
1. 路径拼接
import os
# os.path.join(父级路径, 子路径)
for fn in filenames:
file_path = os.path.join('.', fn)
print(file_path)
2. 获取指定文件的绝对路径
import os
abs_path = os.path.abspath('.')
print(abs_path) # E:\实习\21 暑假实习\每天\day11\代码\Day11
3. 获取文件的后缀
import os
# 将文件名与后缀进行切割 放在元组中 元组的最后一个值表示的是后缀名
ext = os.path.splitext('./test')
print(ext) # ('./test', '')
ext = os.path.splitext('./test1.py')
print(ext) # ('./test1', '.py')
4. 获取文件名称
import os
# 获取的是路径最后一级的名字
filename = os.path.basename('./test1.py')
print(filename) # test1.py
filename = os.path.basename(abs_path)
print(filename) # Day11
5. 获取包含最后一级的文件路径
import os
#
dirname = os.path.dirname(abs_path)
print(dirname) # E:\实习\21 暑假实习\每天\day11\代码
dirname = os.path.dirname('./test1.py')
print(dirname) # .
6. 获取文件的大小
import os
file_size = os.path.getsize('./test1.py')
print(file_size) # 1070 字节大小
7.关于文件的一些操作的时间
import os
import time
# 创建时间
ctime = os.path.getctime('./test1.py')
print(ctime) # 1627351515.7399309
print(time.localtime(ctime))
# 修改时间
mtime = os.path.getmtime('./test1.py')
print(time.localtime(mtime))
# 访问时间
atime = os.path.getatime('./test1.py')
print(time.localtime(atime))
8. 判断路径对应的目录是否存在的
import os
res = os.path.exists('./demo')
print(res) # False
res = os.path.exists('./test1.py')
print(res) # True
9. 判断路径对应的是否是文件夹
import os
res = os.path.isdir('.')
print(res) # True
res = os.path.isdir('./test1.py')
print(res) # False
10. 判断路径对应的是否是文件
import os
res = os.path.isfile('.')
print(res) # False
res = os.path.isfile('./test1.py')
print(res) # True
11. 判断路径是否是绝对路径
import os
res = os.path.isabs('.')
print(res) # False
res = os.path.isabs(abs_path)
print(res) # True