一、模块

面条>>>>函数

封装代码
让不同功能的代码独立开来

模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module。

四大模块

1.自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件

2.第三方模块:已被编译为共享库或DLL的C或C++扩展

3.内置模块:使用C编写并链接到python解释器的内置模块

4.包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

import 模块名1(,模块2) (as 名称1(,名称2))

优点:模块内的所有功能都能用

缺点:占用内存大,使用时要用‘模块名.功能()’来使用

1.打开文件
2.把文件内的内容读入Python解释器的内存然后把文件内的名字放入特定的模块名称空间
3.使用函数时会去相应的名称空间中寻找对应方法
4.导入即可使用

from 模块名 import 具体功能(*代表所有功能)

优点:占用内存少,使用时直接’功能()‘就能使用

缺点:只能用具体功能,可能出现冲突

1.打开文件
2.把文件内的内容读入Python解释器的内存然后把文件内的名字放入特定的模块名称空间
3.将功能单独拿出来放入特定名称空间中去
4.导入即可使用

循环导入 #最好不要出现

# m1.py
from m2 import y
x = 10
print(x)
# m2.py
from m1 import x
y = 20
print(y)

循环导入问题:我现在有m1和m2两个文件,然后m1需要找到m2的y;m2需要找到m1的x,但是由于代码至上而下运行,m1中的x还没有生成;m2中的y也没有生成,所以m1找不到m2的y;m2找不到m1的x,就造成了一个死循环

解决方案一:导入之前让变量提前生成,但是又发现了一个新问题,会执行两次print

print(name) # 在当前执行文件内打印它为'main',在导入时打印它为文件名

解决方案二:把需要导入的名字y封装到函数体内部。名字的执行顺序:内置--》全局--》局部, 调用函数的时候才会用到y,调用函数之前,全局变量x已经生成了,m2能找到x,y就能够生成,m1就能找到y,问题就解决了

方案一 #不推荐

# m1.py
print('from m1.py')


y = 'm1'
from m2 import x
# m2.py
print('from m2.py')

x = 'm2'
from m1 import y

当一个模块被第一次导入时,Python 会执行它,并将其缓存。后续任何对该模块的导入操作,都会直接从缓存中获取已经加载好的模块对象,而不会再次执行模块文件中的代码。

方案二

# m1.py
print('from m1.py')


def func1():
    from m2 import x
    print(x)


y = 'm1'
# m2.py
print('from m2.py')

def func1():
    from m1 import y
    print(y)


x = 'm2'

__name__ #在模块文件时是模块名,作为执行文件时是__main__

print(__name__)
__main__

模块搜索路径的顺序 #以执行文件为标准

1.先从内存中已经导入的模块中寻找

2.内置的模块

3.环境变量sys.path中找

python文件总共有两种用途,一种是执行文件(main.py);另一种是被当做模块导入。

二、包

1.创建一个包的名称空间

2.由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)

3.在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

__init__.py

在这里把你希望用户直接访问的函数或类暴露出来

# src/my_calculator/__init__.py
print("my_calculator package is being imported!")  # 这句会在包被导入时执行

# 从模块中导入函数,提升到包的顶层命名空间
from .add import add_numbers
from .multiply import multiply_numbers

# (可选) 控制 'from my_calculator import *' 的行为
__all__ = ['add_numbers', 'multiply_numbers']
__version__ = "0.1.0"  # 定义包的版本

相对路径 #以当前文件为标准

. 当前

.. 上一级

... 上一级的上一级

.前面必须是一个包,不能是一个模块

三、json&os

用with open打开文本但是保存为.json文本

json一般用于保存python中的字典(最常用的)或者列表

存入(内存) json.dumps()

import json
food_info = {'香的': '烤土豆饼', '臭的': '臭豆腐', '酸的': '柠檬茶'}
res = json.dumps(food_info)
print(res, type(res))
{"\u9999\u7684": "\u70e4\u571f\u8c46\u997c", "\u81ed\u7684": "\u81ed\u8c46\u8150", "\u9178\u7684": "\u67e0\u6aac\u8336"} <class 'str'>

取出(内存)json.loads()

food_info = {'香的': '烤土豆饼', '臭的': '臭豆腐', '酸的': '柠檬茶'}
res = json.dumps(food_info)
res1 = json.loads(res)
print(res1,type(res1))
{'香的': '烤土豆饼', '臭的': '臭豆腐', '酸的': '柠檬茶'} <class 'dict'>

存入(文件) json.dump(obj,fw)

with open('fooddict.json', 'w', encoding='utf-8') as fw:
    json.dump(food_info, fw)

# fooddict.json

香的"烤土豆饼"

臭的"臭豆腐"

酸的"柠檬茶"

取出(文件) json.load(obj,fr)

with open('fooddict.json', 'r', encoding='utf-8') as fr:
    data = json.load(fr)
print(data,type(data))
{'香的': '烤土豆饼', '臭的': '臭豆腐', '酸的': '柠檬茶'} <class 'dict'>

列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.listdir()

import os
dir_list = os.listdir(r'D:\桌面\game')
print(dir_list)
['1.txt', 'games', 'main.py', 'README.md', 'requirements.txt']

删除一个文件os.remove()

os.remove(r'D:\桌面\game\1.txt')
dir_list = os.listdir(r'D:\桌面\game')
print(dir_list)
['games', 'main.py', 'README.md', 'requirements.txt']

重命名文件/目录os.rename("oldname","newname")

os.rename(r'D:\桌面\game\1.txt', r'D:\桌面\game\2.py')
dir_list = os.listdir(r'D:\桌面\game')
print(dir_list)
['2.py', 'games', 'main.py', 'README.md', 'requirements.txt']

path规范化os.path.

文件是否存在 os.path.isfile(path)

print(os.path.isfile(r'D:\桌面\game\2.py'))
print(os.path.isfile(r'D:\桌面\game'))
print(os.path.isfile(r'D:\桌面\game\3.py'))
True
False
False

文件夹是否存在 os.path.isdir(path)

print(os.path.isdir(r'D:\桌面\game'))
True

路径是否存在os.path.exists(path)

print(os.path.exists(r'D:\桌面\game\2.py'))
print(os.path.exists(r'D:\桌面\game'))
True
True

新建文件夹os.mkdir('dirname')

os.mkdir(r'D:\桌面\game\3')
dir_list = os.listdir(r'D:\桌面\game')
print(dir_list)
['2.py', '3', '3.json', 'games', 'main.py', 'README.md', 'requirements.txt']

将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.join(path1[, path2[, ...]])

遍历目录树 os.walk() #递归访问指定目录及其所有子目录

res = os.walk(r'D:\桌面\supermarket')
for i in res:
    print(i)
('D:\\桌面\\supermarket', ['models', 'output', 'videos', 'yolov5', '__pycache__'], ['desktop.ini', 'head_detector.py', 'main.py', 'Project structure.py'])
('D:\\桌面\\supermarket\\models', [], ['age_deploy.prototxt', 'age_net.caffemodel', 'deploy.prototxt', 'desktop.ini', 'gender_deploy.prototxt', 'gender_net.caffemodel', 'Head_Detect_best.onnx', 'opencv_face_detector.pbtxt', 'opencv_face_detector_uint8.pb', 'res10_300x300_ssd_iter_140000.caffemodel', 'yolov5s.pt'])
('D:\\桌面\\supermarket\\output', [], [])
('D:\\桌面\\supermarket\\videos', [], ['input_video.mp4'])
('D:\\桌面\\supermarket\\yolov5', ['.git', '.github', 'classify', 'data', 'models', 'segment', 'utils'], ['.dockerignore', '.gitattributes', '.gitignore', 'benchmarks.py', 'CITATION.cff', 'CONTRIBUTING.md', 'detect.py', 'export.py', 'hubconf.py', 'LICENSE', 'pyproject.toml', 'README.md', 'README.zh-CN.md', 'requirements.txt', 'train.py', 'tutorial.ipynb', 'val.py'])
('D:\\桌面\\supermarket\\yolov5\\.git', ['hooks', 'info', 'logs', 'objects', 'refs'], ['config', 'description', 'HEAD', 'index', 'packed-refs'])
('D:\\桌面\\supermarket\\yolov5\\.git\\hooks', [], ['applypatch-msg.sample', 'commit-msg.sample', 'fsmonitor-watchman.sample', 'post-update.sample', 'pre-applypatch.sample', 'pre-commit.sample', 'pre-merge-commit.sample', 'pre-push.sample', 'pre-rebase.sample', 'pre-receive.sample', 'prepare-commit-msg.sample', 'push-to-checkout.sample', 'sendemail-validate.sample', 'update.sample'])
('D:\\桌面\\supermarket\\yolov5\\.git\\info', [], ['exclude'])
('D:\\桌面\\supermarket\\yolov5\\.git\\logs', ['refs'], ['HEAD'])
('D:\\桌面\\supermarket\\yolov5\\.git\\logs\\refs', ['heads', 'remotes'], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\logs\\refs\\heads', [], ['master'])
('D:\\桌面\\supermarket\\yolov5\\.git\\logs\\refs\\remotes', ['origin'], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\logs\\refs\\remotes\\origin', [], ['HEAD'])
('D:\\桌面\\supermarket\\yolov5\\.git\\objects', ['info', 'pack'], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\objects\\info', [], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\objects\\pack', [], ['pack-811a6b7ff8a7919b2f80ea57fef8c00a685d9c64.idx', 'pack-811a6b7ff8a7919b2f80ea57fef8c00a685d9c64.pack', 'pack-811a6b7ff8a7919b2f80ea57fef8c00a685d9c64.rev'])
('D:\\桌面\\supermarket\\yolov5\\.git\\refs', ['heads', 'remotes', 'tags'], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\refs\\heads', [], ['master'])
('D:\\桌面\\supermarket\\yolov5\\.git\\refs\\remotes', ['origin'], [])
('D:\\桌面\\supermarket\\yolov5\\.git\\refs\\remotes\\origin', [], ['HEAD'])
('D:\\桌面\\supermarket\\yolov5\\.git\\refs\\tags', [], [])
('D:\\桌面\\supermarket\\yolov5\\.github', ['ISSUE_TEMPLATE', 'workflows'], ['dependabot.yml'])
('D:\\桌面\\supermarket\\yolov5\\.github\\ISSUE_TEMPLATE', [], ['bug-report.yml', 'config.yml', 'feature-request.yml', 'question.yml'])
('D:\\桌面\\supermarket\\yolov5\\.github\\workflows', [], ['ci-testing.yml', 'cla.yml', 'docker.yml', 'format.yml', 'links.yml', 'merge-main-into-prs.yml', 'stale.yml'])
('D:\\桌面\\supermarket\\yolov5\\classify', [], ['predict.py', 'train.py', 'tutorial.ipynb', 'val.py'])
('D:\\桌面\\supermarket\\yolov5\\data', ['hyps', 'images', 'scripts'], ['Argoverse.yaml', 'coco.yaml', 'coco128-seg.yaml', 'coco128.yaml', 'GlobalWheat2020.yaml', 'ImageNet.yaml', 'ImageNet10.yaml', 'ImageNet100.yaml', 'ImageNet1000.yaml', 'Objects365.yaml', 'SKU-110K.yaml', 'VisDrone.yaml', 'VOC.yaml', 'xView.yaml'])
('D:\\桌面\\supermarket\\yolov5\\data\\hyps', [], ['hyp.no-augmentation.yaml', 'hyp.Objects365.yaml', 'hyp.scratch-high.yaml', 'hyp.scratch-low.yaml', 'hyp.scratch-med.yaml', 'hyp.VOC.yaml'])
('D:\\桌面\\supermarket\\yolov5\\data\\images', [], ['bus.jpg', 'zidane.jpg'])
('D:\\桌面\\supermarket\\yolov5\\data\\scripts', [], ['download_weights.sh', 'get_coco.sh', 'get_coco128.sh', 'get_imagenet.sh', 'get_imagenet10.sh', 'get_imagenet100.sh', 'get_imagenet1000.sh'])
('D:\\桌面\\supermarket\\yolov5\\models', ['hub', 'segment', '__pycache__'], ['common.py', 'experimental.py', 'tf.py', 'yolo.py', 'yolov5l.yaml', 'yolov5m.yaml', 'yolov5n.yaml', 'yolov5s.yaml', 'yolov5x.yaml', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\models\\hub', [], ['anchors.yaml', 'yolov3-spp.yaml', 'yolov3-tiny.yaml', 'yolov3.yaml', 'yolov5-bifpn.yaml', 'yolov5-fpn.yaml', 'yolov5-p2.yaml', 'yolov5-p34.yaml', 'yolov5-p6.yaml', 'yolov5-p7.yaml', 'yolov5-panet.yaml', 'yolov5l6.yaml', 'yolov5m6.yaml', 'yolov5n6.yaml', 'yolov5s-ghost.yaml', 'yolov5s-LeakyReLU.yaml', 'yolov5s-transformer.yaml', 'yolov5s6.yaml', 'yolov5x6.yaml'])
('D:\\桌面\\supermarket\\yolov5\\models\\segment', [], ['yolov5l-seg.yaml', 'yolov5m-seg.yaml', 'yolov5n-seg.yaml', 'yolov5s-seg.yaml', 'yolov5x-seg.yaml'])
('D:\\桌面\\supermarket\\yolov5\\models\\__pycache__', [], ['common.cpython-38.pyc', 'experimental.cpython-38.pyc', 'yolo.cpython-38.pyc', '__init__.cpython-38.pyc'])
('D:\\桌面\\supermarket\\yolov5\\segment', [], ['predict.py', 'train.py', 'tutorial.ipynb', 'val.py'])
('D:\\桌面\\supermarket\\yolov5\\utils', ['aws', 'docker', 'flask_rest_api', 'google_app_engine', 'loggers', 'segment', '__pycache__'], ['activations.py', 'augmentations.py', 'autoanchor.py', 'autobatch.py', 'callbacks.py', 'dataloaders.py', 'downloads.py', 'general.py', 'loss.py', 'metrics.py', 'plots.py', 'torch_utils.py', 'triton.py', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\aws', [], ['mime.sh', 'resume.py', 'userdata.sh', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\docker', [], ['Dockerfile', 'Dockerfile-arm64', 'Dockerfile-cpu'])
('D:\\桌面\\supermarket\\yolov5\\utils\\flask_rest_api', [], ['example_request.py', 'README.md', 'restapi.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\google_app_engine', [], ['additional_requirements.txt', 'app.yaml', 'Dockerfile'])
('D:\\桌面\\supermarket\\yolov5\\utils\\loggers', ['clearml', 'comet', 'wandb'], ['__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\loggers\\clearml', [], ['clearml_utils.py', 'hpo.py', 'README.md', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\loggers\\comet', [], ['comet_utils.py', 'hpo.py', 'optimizer_config.json', 'README.md', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\loggers\\wandb', [], ['wandb_utils.py', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\segment', [], ['augmentations.py', 'dataloaders.py', 'general.py', 'loss.py', 'metrics.py', 'plots.py', '__init__.py'])
('D:\\桌面\\supermarket\\yolov5\\utils\\__pycache__', [], ['augmentations.cpython-38.pyc', 'autoanchor.cpython-38.pyc', 'dataloaders.cpython-38.pyc', 'downloads.cpython-38.pyc', 'general.cpython-312.pyc', 'general.cpython-38.pyc', 'metrics.cpython-38.pyc', 'plots.cpython-38.pyc', 'torch_utils.cpython-38.pyc', '__init__.cpython-312.pyc', '__init__.cpython-38.pyc'])
('D:\\桌面\\supermarket\\__pycache__', [], ['head_detector.cpython-38.pyc'])
res = os.walk(r'D:\桌面\supermarket')
for path, _, file_list in res:
    for file in file_list:
        filename = os.path.join(path, file)
        if filename.endswith('py'):
            print(filename)
D:\桌面\supermarket\head_detector.py
D:\桌面\supermarket\main.py
D:\桌面\supermarket\Project structure.py
D:\桌面\supermarket\yolov5\benchmarks.py
D:\桌面\supermarket\yolov5\detect.py
D:\桌面\supermarket\yolov5\export.py
D:\桌面\supermarket\yolov5\hubconf.py
D:\桌面\supermarket\yolov5\train.py
D:\桌面\supermarket\yolov5\val.py
D:\桌面\supermarket\yolov5\classify\predict.py
D:\桌面\supermarket\yolov5\classify\train.py
D:\桌面\supermarket\yolov5\classify\val.py
D:\桌面\supermarket\yolov5\models\common.py
D:\桌面\supermarket\yolov5\models\experimental.py
D:\桌面\supermarket\yolov5\models\tf.py
D:\桌面\supermarket\yolov5\models\yolo.py
D:\桌面\supermarket\yolov5\models\__init__.py
D:\桌面\supermarket\yolov5\segment\predict.py
D:\桌面\supermarket\yolov5\segment\train.py
D:\桌面\supermarket\yolov5\segment\val.py
D:\桌面\supermarket\yolov5\utils\activations.py
D:\桌面\supermarket\yolov5\utils\augmentations.py
D:\桌面\supermarket\yolov5\utils\autoanchor.py
D:\桌面\supermarket\yolov5\utils\autobatch.py
D:\桌面\supermarket\yolov5\utils\callbacks.py
D:\桌面\supermarket\yolov5\utils\dataloaders.py
D:\桌面\supermarket\yolov5\utils\downloads.py
D:\桌面\supermarket\yolov5\utils\general.py
D:\桌面\supermarket\yolov5\utils\loss.py
D:\桌面\supermarket\yolov5\utils\metrics.py
D:\桌面\supermarket\yolov5\utils\plots.py
D:\桌面\supermarket\yolov5\utils\torch_utils.py
D:\桌面\supermarket\yolov5\utils\triton.py
D:\桌面\supermarket\yolov5\utils\__init__.py
D:\桌面\supermarket\yolov5\utils\aws\resume.py
D:\桌面\supermarket\yolov5\utils\aws\__init__.py
D:\桌面\supermarket\yolov5\utils\flask_rest_api\example_request.py
D:\桌面\supermarket\yolov5\utils\flask_rest_api\restapi.py
D:\桌面\supermarket\yolov5\utils\loggers\__init__.py
D:\桌面\supermarket\yolov5\utils\loggers\clearml\clearml_utils.py
D:\桌面\supermarket\yolov5\utils\loggers\clearml\hpo.py
D:\桌面\supermarket\yolov5\utils\loggers\clearml\__init__.py
D:\桌面\supermarket\yolov5\utils\loggers\comet\comet_utils.py
D:\桌面\supermarket\yolov5\utils\loggers\comet\hpo.py
D:\桌面\supermarket\yolov5\utils\loggers\comet\__init__.py
D:\桌面\supermarket\yolov5\utils\loggers\wandb\wandb_utils.py
D:\桌面\supermarket\yolov5\utils\loggers\wandb\__init__.py
D:\桌面\supermarket\yolov5\utils\segment\augmentations.py
D:\桌面\supermarket\yolov5\utils\segment\dataloaders.py
D:\桌面\supermarket\yolov5\utils\segment\general.py
D:\桌面\supermarket\yolov5\utils\segment\loss.py
D:\桌面\supermarket\yolov5\utils\segment\metrics.py
D:\桌面\supermarket\yolov5\utils\segment\plots.py
D:\桌面\supermarket\yolov5\utils\segment\__init__.py
posted on 2025-08-06 19:57  新月绘影  阅读(12)  评论(0)    收藏  举报