Python 学习笔记 模块 & 目录遍历 & 包

2023-05-16

一、 模块:

1.概述:

为了解决维护问题,一般情况下,在一个完整的项目中,会将特定的功能分组,分别放到不同的文件中,在使用的过程中,可以单独维护,各个不同的文件之间互不影响,每个.py文件就被称为一个模块,通过结合包的使用来组织文件

封装思路: 函数 => 类 => 模块 => 包 => 项目

优点:

a.提高了代码的可维护性

b.提高了代码的复用性【当一个模块被完成之后,可以在多个文件中使用】

c.引用其他的模块【第三方模块】

d.避免函数名和变量的命名冲突

2.os模块:

提供有关于操作系统的函数,处理文件或者文件夹

基础os使用:

# 获取操作系统:
print(os.name)
# nt ----->Windows
# posix---->Linux,MacOs

# 获取环境变量:
print(os.environ)
print(os.environ.get('PATH'))

# 当前目录curdir:
print(os.curtir) # .

# 当前目录(路径)getcwd:
# 绝对路径:从磁盘根目录的完整路径:
# 相对路径:从当前目录(或项目目录)开始的路径:
print(os.cwd())
# D:\pythonsj\practice

# listdir()获取指定路径下所有的文件名或目录的名字,返回一个列表:
print(os.listdir(r'D:\pythonsj'))
# ['ddd', 'myfirst', 'practice']

# mkdir()创建新目录:
os.mkdir('giao哥')
# makedirs()递归创建新目录:
os.makedir('a/b/c')

# rmdir()删除目录:
os.rmdir('geao哥')

# remove()删除文件:
os.remove('hello')
# rename()文件/目录重命名:
os.rename('guao哥','小阿giao')

# stat(了解)文件属性:
print(os.stat('giao哥/ccb.txt'))


os.path的使用

# 多路径拼接join():
os.path.join(r'D:\pythonsj\practice\giao哥','ccb.txt'))

# 路径拆分split():
os.path.split(r'D:\pythonsj\practice\giao哥\ccb.txt')

# 获取文件大小getsize():
os.path.getsize(r'D:\pythonsj\praction\giao哥\ccb.txt')

# 获取指定文件的绝对路径abspath():
os.path.abspath('ccb.txt')

# __file__:当前文件名:
os.path.abspath(__file__)

dir_path = r'D:\pythonsj\practice'
file_path = r'D:\pythonsj\practice\giao哥\ccb.txt'

# 判断文件/目录是否存在exists():
os.path.exists(dir_path)
os.path.exists(file_path)

# 判断是否为文件isfile():
os.path.isfile(dir_path)
os.path.isfile(file_path)

# 判断是否为目录isdir():
os.path.isdir(dir_path)
os.path.iadir(file_path)

# 查询父目录dirname():
os.path.dirname(dir_name)
os.path.dirname(file_name)

# 获取文件名basename():
os.path.basename(dir_name)
os.path.basename(file_name)


3.自定义模块:

3.1 自定义import模块

格式:import 包1.包2.模块的名称
注意1:通过点语法区分包的层级关系
引入模块
注意2:如果要同时导入多个模块,有两种方式
方式一:


import os
import datetime
import math


注意3:当导入自定义模块的时候,需要注意包的存在
注意4:当通过import将模块导入的时候,将模块对应的文件整个加载了一遍
注意5:当模块有包的层级关系时,需要调用其中函数的时候,需要指明函数的路径
方式二

import os,math,datetime
import ccc.module
import moduleTextDemo01

ccc.module.test()     #os.path.isdir()

moduleTextDemo01.fun1()
moduleTextDemo01.fun2()
moduleTextDemo01.fun3()

print(moduleTextDemo01.num)

3.2 自定义from-import模块

form 模块名 import 函数名1/类名,函数名

from moduleTextDemo01 import  fun1,fun2,fun3

#注意:采用了form。。。import的方式导入指定的函数之后,可以直接调用函数
fun1()
fun2()
fun3()

#好处:进行局部的导入,避免内存空间的浪费


#注意:当前文件中如果存在和模块中同名的函数的时候,当前文件中的函数仍然会将模块中的函数给覆盖掉
def fun1():
 print("hello")

fun1()

3.3 自定义from-import*模块

下面三种导入方式完全等价:将moduleTextDemo01模块中的所有的内容全部导入
from moduleTextDemo01 import  *
import moduleTextDemo01
from  moduleTextDemo01 import  fun1,fun2,fun3

fun1()

总结:在python中,每个py文件其实都是一个模块,如果跨模块调用函数,则采用导入的方式

将不同的功能进行划分,调用函数的时候相对比较方便的

4.name属性和dir函数:

4.1 name属性:

__name__的作用:如果不想让模块中的某些代码执行,可以通过属性仅仅调用程序中的一部分功能
【写在if判断中的代码只有当前模块被执行的时候才会被执行,检测到是其他的文件在使用当前的模块,则if语句中的代码不会被执行】

def fun1():
 print("aaa")

def fun2():
 print("bbb")

def fun3():
 print("ccc")


#作用:写在下面判断中的代码,只有当前模块运行的时候才会被执行【起到屏蔽的作用】
if __name__ == "__main__":
 fun1()
 fun2()
 fun3()

4.2 dir函数:

import math,moduleTextDemo01

#获取指定模块里面的所有的内容
#dir(模块名称)  返回的是一个列表
print(dir(math))
print(dir(moduleTextDemo01))

二、目录遍历:

#递归
import os

def getAll(path):
 #1.获取当前目录下所有的文件以及文件夹
 fileList = os.listdir(path)
 print(fileList)

 #2.遍历列表
 for i in fileList:
     #3.拼接路径
     filePath = os.path.join(path,i)

     #4.判断filePath是否是文件夹
     if os.path.isdir(filePath):
         #文件夹:递归
         getAll(filePath)
     else:
         #文件
         print("文件:",i)

getAll(r"C:\Users\Administrator\Desktop\SZ-Python")

三、包:

包:初期理解为文件夹

作用:一种管理Python模块命名空间的形式,采用"点语法" os.path

包和文件夹之间的区别:Python的包中有一个特殊的文件__init__.py文件,前期里面不写任何内容,但是,就是为了告诉编译器,当前这个目录不是普通目录,是一个包

创建方式:选中工程,创建Python package

#第一步:导入模块
#导入格式:包名.模块名
import aaa.textDemo01
import ccc.module

#os.path.isdir()
aaa.textDemo01.test()
ccc.module.test()


包存在的意义:在团队开发的过程中,为了解决文件命名冲突的问题,只要保证最上层的包命名不相同,就不会与别人的发生冲突

四、习题:

1.显示指定路径下所有视频格式文件, 提示: 视频格式mp4,avi,rmvb
2.
自定义模块
建立一个包
在包的下创建一个排序的模块
模块下的功能

五、上期习题答案:

  1. 写一个装饰器来统计函数运行的时间
import time

def showtime(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('spend is {}'.format(end_time - start_time))
    return wrapper

@showtime
def foo():
    print('foo..')
    time.sleep(3)

foo()

  1. 使用Python写一个按照下面方式调用都能正常工作的 my_sum() 方法
    print(my_sum(2,3)) 输出 5
    print(my_sum(2)(3)) 输出 5
def my_sum(*args):
    def sum1(n):
        return args[0] + n

    if len(args) == 2:
        return args[0] + args[1]
    else:
        return sum1

print(my_sum(1, 2))
print(my_sum(1)(2))

  1. 封装一个函数random_color,该函数的返回值为随机十六进制颜色。
    说明: 十六进制颜色#开头后面接6个十六进制数, 例: #FFFFFF, #000000, #0033CC
import random

colors = '0123456789ABCDEF'

def random_color():
    str = ''

    for i in range(6):
        str += random.choice(colors)
    return '#' + str

print(random_color())

  1. 封装函数,第一个函数create_persons(), 创建并返回包含5个字典(例如:{“name”:“xx”,“age”:xx, “faceValue”:100})的列表
    其中name的值:从[“张三”,“李四”,“王五”,“赵六”,“钱七”]依次取
    其中age的值:10-100之间的随机整数
    其中faceValue的值:0-100之间的随机整数
    第二个函数get_old(), 传入第一个函数创建的列表, 找出列表中年龄最大的人,并将其所有信息打印
    第三个函数sort_facevalue(), 传入第一个函数创建的列表, 根据颜值升序排列,并打印排序后的信息
    提示: colors = ‘0123456789ABCDEF’
    random模块
def create_persons():
    import random
    l1 = []

    l2 = ["张三", "李四", "王五", "赵六", "钱七"]
    for i in range(5):
        dic = {}
        l1.append(dic)
        l1[i]['name'] = l2[i]
        l1[i]['age'] = random.choice(range(10, 101))
        l1[i]['faceValue'] = random.choice(range(101))
    return l1


def get_old(lis):
    a = 0
    mx = lis[0]['age']

    for i in range(0, 5):
        if lis[i]['age'] > mx:
            mx = lis[i]['age']
            a = i
    return lis[a]


def sort_facevalue(persons):
    # for i in range(len(persons) - 1):
    #     a = 0
    #     for j in range(len(persons) - i - 1):
    #         if persons[j]['faceValue'] < persons[j + 1]['faceValue']:
    #             persons[j], persons[j + 1] = persons[j + 1], persons[j]
    persons.sort(key=lambda d: d['faceValue'])
    return persons


persons = create_persons()
print(create_persons())
print(get_old(persons))
print(sort_facevalue(persons))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 学习笔记 模块 & 目录遍历 & 包 的相关文章

随机推荐