Python笔记15-包和模块

一、包和模块

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+以上的第三方模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值