8.包和模块

本文详细介绍了Python中的模块和包的使用,包括导入、别名设定,以及第三方模块的下载安装。重点讲解了time、datetime、calendar和math模块,涉及时间戳、日期格式化、时间差运算和数学函数。同时,概述了os和os.path模块在文件和路径操作中的功能,如创建、删除文件夹,获取文件属性等。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值