一、包和模块
1.包
包【package】是一种管理 Python 模块命名空间的形式,采用"点模块名称"
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况
package本质是一个文件夹【目录】,但是特殊之处在于:该文件夹下有一个文件__init__.py,代表初始化,但是前期空的,后期在项目开发中,会在其中书写一些项目的配置信息
注意:实际上,一个py文件就是一个模块,一个模块名包括包名和文件名
如:import aaa.file ,aaa表示包名或者目录名。file是文件名,二者同时组成了一个模块名
"""
注意:
1.包的存在是为了管理模块,本质上是为了管理py文件【一个py文件就是一个模块】
2.如果在一个文件中要访问另一个模块中的变量,或函数或类,不能直接访问,需要先导入模块,然后再访问
3.如果需要导入自定义的模块,则需要注意路径问题,使用相对路径,包和文件夹的使用相同
a.默认情况下,从当前工程的根目录开始,不管目录的层级关系多么复杂,注意书写方式
b.可以将指定的包或目录标记为根目录,在书写模块的路径时,则可以从标记的根目录开始书写
标记方式:选中需要标记的包或目录---》右键----》Mark Directory as---->Source Root
4.import xxx,xxx其中可以包含包名,目录名和py文件名
"""
# 1.系统模块
import random # 加载的是py文件
import math # 加载的是py文件
print(math.pi)
print(math.sqrt(9))
n1 = random.choice(range(10))
print(n1)
# 2.导入自定义包中的自定义模块
import aaa.module
import bbb.module
print(aaa.module.num)
print(bbb.module.num)
# 默认从工程根目录开始
# import ccc.c1.c2.text
# print(ccc.c1.c2.text.num1)
# print(ccc.c1.c2.text.num2)
# print(ccc.c1.c2.text.num3)
# 标记c1为资源的根目录
# import c2.text
# print(c2.text.num1)
# print(c2.text.num2)
# print(c2.text.num3)
# 标记c2为资源的根目录
import text
print(text.num1)
print(text.num2)
print(text.num3)
2.自定义模块
目前代码比较少,写在一个文件中还体现不出什么缺点,但是随着代码量越来越多,代码就越来越难以维护。
为了解决难以维护的问题,我们把很多相似功能的函数进行分组,分别放到不同的文件中。这样每个文件所包含的内容相对较少,而且对于每一个文件的大致功能可用文件名来体现。很多编程语言都是这么来组织代码结构。
注意:其实一个.py文件就是一个模块
【面试题】优点:
- 提高代码的可维护性
- 提高了代码的复用度,当一个模块书写完毕,可以被多个地方引用
- 引用其他的模块
- 避免函数名和变量名的命名冲突
2.1导入方式一
# 1.import xxxx:导入某个模块,将该模块中允许被加载的所有内容导入
# 方式一
# import aaa.module
# import bbb.module
# 方式二
import aaa.module,bbb.module
# import random,math
print(aaa.module.num)
print(bbb.module.num)
aaa.module.func()
bbb.module.func()
# 2.import xxxx as xxxx:导入某个模块,将该模块中允许被加载的所有内容导入
# as表示给模块起别名,一般模块的路径关系比较复杂的情况下
import ccc.c1.c2.text as c
print(c.num1)
print(c.num2)
print(c.num3)
"""
import xxx
优点:
不同模块中如果有重名的变量,函数或类,使用的时候相互之间不影响
缺点:
在每次访问变量,函数或类的时候,都需要声明模块名,代码比较繁琐
"""
# 结论:使用一个模块,只需要导入一次,导入多次没有意义,
# 为了节省资源和提高工作效率,不会将指定的模块重复加载
2.2导入方式二
# 1.from 模块名 import 变量,函数,类
from aaa.module import num,func,func1
from bbb.module import num,func
from ccc.c1.c2.text import num1
print(num)
func()
func1()
print(num1)
# 2.from 模块名 import *,表示全部导入
# from aaa.module import *
# from ccc.c1.c2.text import *
# print(num)
# func()
# func1()
# print(num1)
# print(num2)
# print(num3)
"""
from xxx import xxxx
优点:
访问变量,函数或类的时候,不需要声明模块路径
可以进行选择性的导入需要使用的变量,函数或,可以节约内存空间
缺点:
如果不同模块中出现重名的变量,函数或类,则后出现的会覆盖掉之前出现的
如果一个模块中包含大量的变量,函数或类,需要全部使用的话,依次导入会非常麻烦,则可以使用from 模块名 import *进行简化
"""
2.3dir()和name
import random
import aaa.module
# 1.dir():列出一个模块中包含的所有内容
# print(dir(random))
# print(dir(aaa.module))
# 列出一个对象中包含的所有的内容
# print(dir('abc'))
# print(dir([34,6]))
#2.__name__
"""
特点:
如果run的是模块本身,__name__的值是__main__
如果run的是其他文件,模块是被导入的,__name__的值是模块名
作用:
A模块被导入到别的文件中使用,如果其中的某些代码不希望被执行,则可以'屏蔽'到if __name__ == "__main__"
用途:
如果在一个模块中封装了函数,在当前模块中可以测试调用,也可以在别的文件中导入使用,
此时就可以将测试调用的代码书写到if __name__ == "__main__"
"""
3.系统模块
3.1time模块
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。
时间间隔是以秒为单位的浮点小数。
每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。
Python 的 time 模块下有很多函数可以转换常见日期格式
1>名词解释
UTC,格林威治天文时间,世界标准时间,在中国为UTC+8
DST:夏令时,表示时间的显示格式
2>时间的表示形式【掌握】
a.时间戳
以整型或浮点型表示的是一个以秒为单位的时间间隔,这个时间的基础值是1970.1.1的零点开始算起
b.时间元组格式
采用Python的数据结构表示,这个元组有9个整型内容,分别表示不同的含义
c.格式化的时间字符串
from time import *
# 1.time():获取当前时间的时间戳 ******
t1 = time()
print(t1)
# 2.gmtime():获取当前的UTC,为元组形式
t2 = gmtime()
print(t2)
# 3.localtime():获取当地时间,,为元组形式 ******
t3 = localtime()
print(t3)
# 4.mktime():将时间的元组形式转换为时间戳
t4 = mktime(t3)
print(t4)
# 5.ctime():将时间戳转换为时间的字符串,默认格式
t5 = ctime(t1)
print(t5) # Sat Aug 14 21:50:39 2021
# 6.将时间元组形式转换为时间的字符串,默认格式
t6 = asctime(t3)
print(t6) # Sat Aug 14 21:52:17 2021
# 7.strftime():将时间的元组形式转换为时间的字符串,可以自定义格式 *****
# %Y:year %m:month %d:day %H:hour %M:minutes %S:seconds
t7 = strftime("%Y.%m.%d",t3)
print(t7) # 2021.08.14
t7 = strftime("%Y.%m.%d %H:%M:%S",t3)
print(t7) # 2021.08.14 21:55:07
t7 = strftime("%Y/%m/%d %H:%M:%S",t3)
print(t7) # 2021/08/14 21:55:23
# 8.strptime():将时间的字符串形式转换为时间元组形式,也可以理解为解析时间字符串 ******
# 注意:解析时间字符串的时候,一定要注意时间字符串和时间格式之间的完全匹配
# t8 = strptime("2021/08/14 21:55:23","%Y.%m.%d")
# print(t8) # ValueError: time data '2021/08/14 21:55:23' does not match format '%Y.%m.%d'
t8 = strptime("2021/08/14 21:55:23","%Y/%m/%d %H:%M:%S")
print(t8)
# 9.sleep():休眠,让程序进入阻塞状态,指定时间达到之后,会自动解除阻塞,程序会继续向下执行 *****
# 使用场景:使用在进程和线程中较多
print("start")
sleep(5)
print("over")
3.2datetime模块
# datetime模块是在time模块的基础上进行了二次封装
import datetime
"""
date:日期,包含年月日
time:时间,包含时分秒
datetime:日期和时间,包含年月日时分秒
tzinfo:时区
"""
# 1.获取当前时间 ****
d1 = datetime.datetime.now()
print(d1) # 2021-08-03 11:46:57.798894
print(type(d1))
# 2.将时间转换为字符串【时间字符串的格式化】
"""
时间的占位符
%Y:年
%m:月
%d:日
%H:时
%M:分
%S:秒
%d:日 %D:月/日/年
%Y:2021 %y:21
%H:时 %h:月的英文
"""
d2 = datetime.datetime.now()
time_str1 = d2.strftime("%Y.%m.%d %H:%M:%S")
print(time_str1)
print(type(time_str1))
# 3.将格式化字符串转换为时间格式
# 注意:进行时间字符串解析的时候,一定要注意格式的匹配
d3 = datetime.datetime.strptime(time_str1,"%Y.%m.%d %H:%M:%S")
print(d3)
print(type(d3))
# 4.两个时间对象之间可以进行减法运算 *****
date1 = datetime.datetime(2020,10,1,14,15,30,100)
date2 = datetime.datetime(2020,10,3,13,30,31,100)
d4 = date2 - date1
print(d4)
print(d4.days) # property属性
print(d4.seconds)
3.3calendar模块
import calendar
# 1.判断是否是闰年 *****
print(calendar.isleap(2020))
# 2.获取指定年指定月的万年历
print(calendar.month(2020,10))
# 3.获取指定年的万年历
print(calendar.calendar(2020))
# 4.获取指定日期的星期,取值范围为:0~6
print(calendar.weekday(2021,8,8))
# 5.获取指定年份之间闰年的个数
print(calendar.leapdays(2000,2021))
print(dir(calendar))
3.4os模块【重要】
os模块中包含普通的操作系统功能,提供了非常丰富的方法用来处理文件和目录
基本使用
# os模块中包含了普通的操作系统功能,提供了非常丰富的用来处理文件或文件夹的功能
import os
# 一、os模块下的函数
# 1.listdir(path):列出指定路径下所有的内容,包含文件和文件夹, ********
# 返回一个列表,其中的元素是文件或文件夹的名称
path = r"/Users/yangyang/Desktop/coding14" # 绝对路径
r1 = os.listdir(path)
print(r1)
# 2.mkdir(path):创建一个目录 ******
# os.mkdir(r"aaa") # 相对路径
# open():创建一个文件
# f1 = open(r"a1.txt","w",encoding="utf-8")
# 3.rmdir(path):删除一个目录
# os.rmdir(r"aaa")
# 4.remove(path):删除一个文件
# os.remove(r"a1.txt")
# 5.rename(old,new):给指定的文件或文件夹重命名
# os.rename(r"aaa","bbb")
# os.rename(r"a1.txt",'file.txt')
# 二、os.path模块下的函数 *********
# 1.join(父路径,子路径):拼接路径
path = r"/Users/yangyang/Desktop/coding14"
subpath = r"Day2Code"
# a.+,不推荐使用,原因:python是跨平台的,但是,如果采用+的方式拼接路径,不同操作系统中拼接的方式不同
# new_path1 = path + "/" + subpath # 在windows中,new_path1 = path + "\\" + subpath
# print(new_path1)
# b.join()
new_path2 = os.path.join(path,subpath)
print(new_path2)
# 2.split(path):对路径进行分割,结果为一个元组,格式:(父路径,子路径)
r1 = os.path.split(path)
print(r1)
path1 = r"/Users/yangyang/Desktop/coding14/Day2Code/5.输入print.py"
r1 = os.path.split(path1)
print(r1)
# 3.splitext(path):对路径进行分割,结果为一个元组,格式:(父路径,扩展名)
# 如果path是一个文件夹,则结果为(父路径,""),如果path是一个文件,则结果为(父路径,".扩展名")
print(os.path.splitext(path))
print(os.path.splitext(path1))
# 4.isfile(path):判断指定路径是否是文件
print(os.path.isfile(path1))
print(os.path.isfile(path))
# 5.isdir(path):判断指定路径是否是文件夹
print(os.path.isdir(path1))
print(os.path.isdir(path))
# 6.exists(path):判断path是否存在
print(os.path.exists(path))
# 7.getsize(path):获取一个文件的字节大小,常用于文件读写中
print(os.path.getsize(path1))
应用
# os:operation system,操作系统
import os
# 1.重要的功能
# a.listdir(path):列出指定路径下所有的内容,包活文件和文件夹
path = r"/Users/yangyang/Desktop/Coding16"
r1 = os.listdir(path)
print(r1)
# b.join(path1,path2):拼接路径,可以自动识别系统,用相应的拼接符号
# Mac:/ windows:\
# 手动拼接,不建议使用
# path1 = path + '/' + 'Day9'
# print(path1)
path1 = os.path.join(path,'Day9')
print(path1)
# c.isfile(path)/isdir(path):判断一个指定的路径是否是文件/文件夹
path1 = '/Users/yangyang/Desktop/Coding16/Day2/notes/Day2笔记-数据类型和变量&输入输出.md'
print(os.path.isfile(path))
print(os.path.isfile(path1))
print(os.path.isdir(path))
print(os.path.isdir(path1))
# 2.应用
# 需求:封装一个函数,获取一个指定路径下及所有子路径下的所有的py文件
def getfile(path):
# 判断path是否存在
if not os.path.exists(path):
print("路径不存在,无法操作")
return
# 判断path是否是文件
if os.path.isfile(path):
print("路径是一个文件,无法操作")
return
# 路径是存在的,路径是一个文件夹
# 获取path下所有的内容
subpath_list = os.listdir(path)
# print(subpath_list)
# 遍历目录
for filename in subpath_list:
# 拼接子路径
subpath = os.path.join(path,filename)
# print(subpath)
# 判断子路径是否是文件且是否是py文件
if os.path.isfile(subpath): # 文件
if subpath.endswith(".py"):
print(f"【{subpath}】是一个py文件")
else: # 文件夹
# 如果是文件夹,则会重复上述操作:获取--》遍历---》判断
getfile(subpath)
if __name__ == '__main__':
path = r"/Users/yangyang/Desktop/Coding16"
getfile(path)
3.5string模块
# string模块是关于字符串的模块
import string
# 1.获取所有的十进制字符 ******
print(string.digits)
# 2.获取所有的大写字母
print(string.ascii_uppercase)
# 3.获取所有的小写字母
print(string.ascii_lowercase)
# 4.获取所有的字母 *******
print(string.ascii_letters)
# 5.获取所有的八进制或十六进制
print(string.octdigits)
print(string.hexdigits)
# 6.获取所有的标点符号
print(string.punctuation)
# 7.获取所有的空白符:空格,tab,回车,换行等
print(string.whitespace)
# 8.获取所有可打印的字符
print(string.printable)
4.第三方模块
安装第三方模块的方式:
方式一:file--->settings---->Project--->Project Interpreter ---->+
方式二:在cmd中,执行pip install xxxx -i 镜像源
方式三:安装Anaconda,相当于Python,只不过其中已经安装了180+以上的第三方模块