Python基础——模块和包

一、自定义模块

1. 包和模块

模块:

定义:包含一系列数据,函数,类的文件,通常以.py结尾作用:让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。

包:

概念:集合了一组py文件, 提供了一组复杂的功能

1.包 是一个 包含多个模块 的 特殊目录.

2.目录下有一个 特殊的文件 __init__.py

3.包名的 命名方式 和变量名一致,小写字母 + _

2. 导入

2.1 导入路径

在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。 import sys print(sys.path)

[

'当前执行脚本所在的目录', 'D:', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend'

]

  • 在写模块名称时,不能与内置与第三方同名
  • 项目执行文件一般都在根目录,如果执行文件嵌套在内层目录,就需要通过sys.path,append手动添加到路径
import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 

通过 os 和 sys 模块,获取当前脚本文件(__file__ 代表当前脚本路径 )的绝对路径,然后向上找两级目录,将该目录路径添加到 Python 模块搜索路径(sys.path)中,方便导入该目录下的自定义模块 。

2.2 import与form...import..导入

导入方式示例调用方式优点缺点
import 模块名import mathmath.sqrt()避免命名冲突,代码来源清晰代码较长
from 模块名 import 成员from math import sqrtsqrt()代码简洁可能引发命名冲突
from 模块名 import *from math import *sqrt()代码极为简洁容易导致命名冲突,降低代码可读性

2.3 相对导入

相对导入是基于当前模块的位置,使用 .(当前包)和 ..(父包)来定位其他模块。只有在包内部的模块中才能使用相对导入,直接运行的脚本(作为主程序执行的文件)不能使用相对导入。

 from . import 模块名 

from .. import 模块名

2.4 导入别名

import 模块名 as 别名

import numpy as np

2.5 主文件

  • 执行一个py文件时
    __name__ = "__main__"
  • 导入一个py文件时

    __name__ = 模块名

通过__name__来确定主程序,主文件就是程序执行的文件入口。

if __name__ = "__main__":

二、第三方模块

Python内部提供的模块有限,所以在平时在开发的过程中,经常会使用第三方块。
而第三方模块必须要先安装才能可以使用,下面介绍常见的3中安装第三方模块的方式。

1. pip(最常用)

这是Python中最最最常用的安装第三方模块的方式。
Pip其实是一个第三方模块包管理工具,默认安装Pvthon解释器时自动会安装,

默认目录:
MAC系统,即:Python安装路径的bin目录下
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3.9
Windows系统,即:Python安装路径的脚本目录下
C:\Python39\scriptslpip3.exe
C:Python39\scripts\pip3.9.exe

 安装第三方模块,终端执行:

pip install 模块名

 默认安装最新版本,如果要指定版本,在模块后加 == 指定版本

pip install django==2.0

 pip默认是去http://pypi.org去下载第三方模块,国外网站下载速度慢,可以指定安装源:(通常使用豆瓣源)来加快下载速度:

pip install 模块名 -i https://pypi.douban.com/simple/

 其他源可供选择:

 阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/

清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/

中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/

 2. 基于源码安装

如果要安装的模块在pypi.org中不存在 或 因特殊原因无法通过pip instal 安装时,可以直接下载源码,然后基于源码安装,例如:
下载requests源码(压缩包zip、tar、tar.gz)并解压。
下载地址:https://pypi.org/project/requests/#files

 进入目录,终端执行命令

# 编译
python setup.py build
# 安装
python setup.py install

三、内置模块

python常用内置模块汇总

3.1 OS

import os
import shutil

def get_abs_path():
    """
    1. 获取当前脚本绝对路径
    """
    abs_path = os.path.abspath(__file__)
    print(f"1. 当前脚本绝对路径: {abs_path}")
    return abs_path

def get_base_path(abs_path):
    """
    2. 获取当前文件的上级目录(基于传入的绝对路径)
    """
    base_path = os.path.dirname(os.path.dirname(abs_path))
    print(f"2. 上级目录: {base_path}")
    return base_path

def path_join_demo(base_path):
    """
    3. 路径拼接演示
    """
    p1 = os.path.join(base_path, 'xx')
    p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
    print(f"3. 拼接路径1: {p1}")
    print(f"3. 拼接路径2: {p2}")
    return p1, p2

def check_path_exists(path):
    """
    4. 判断路径是否存在
    """
    exists = os.path.exists(path)
    print(f"4. 路径 '{path}' 是否存在: {exists}")
    return exists

def create_dir_demo(base_path):
    """
    5. 创建文件夹演示
    """
    path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
    if not os.path.exists(path):
        os.makedirs(path)
        print(f"5. 已创建文件夹: {path}")
    else:
        print(f"5. 文件夹 {path} 已存在")
    return path

def check_is_dir_demo(base_path):
    """
    6. 判断是否是文件夹演示
    """
    file_path = os.path.join(base_path, 'xx', 'oo', 'a1.png')
    folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
    
    is_file_dir = os.path.isdir(file_path)
    is_folder_dir = os.path.isdir(folder_path)
    
    print(f"6. 文件路径 '{file_path}' 是否是文件夹: {is_file_dir}")
    print(f"6. 文件夹路径 '{folder_path}' 是否是文件夹: {is_folder_dir}")
    
    return is_file_dir, is_folder_dir

def delete_file_or_folder(base_path):
    """
    7. 删除文件或文件夹演示
    """
    # 创建测试文件
    test_file = os.path.join(base_path, 'test.txt')
    with open(test_file, 'w') as f:
        f.write('测试内容')
    print(f"7. 已创建测试文件: {test_file}")
    
    # 删除文件
    os.remove(test_file)
    print(f"7. 已删除文件: {test_file}")
    
    # 删除文件夹(需要先创建)
    test_dir = os.path.join(base_path, 'test_dir')
    os.makedirs(test_dir, exist_ok=True)
    print(f"7. 已创建测试文件夹: {test_dir}")
    
    # 删除文件夹(递归删除)
    shutil.rmtree(test_dir)
    print(f"7. 已删除文件夹: {test_dir}")

def get_list(path):
    """
    # 查看目录下的所有文件
    """
    data = os.listdir(path)
    print(data) # 打印出当前路径下文件夹下所有文件

3.2 shutil

import os
import shutil


# --- 删除操作 ---
def delete_dir(path):
    """删除文件夹(若存在)"""
    if os.path.exists(path):
        shutil.rmtree(path)
        print(f" 已删除: {path}")
    else:
        print(f"文件夹不存在: {path}")

# --- 复制操作 ---
def copy_dir(src, dst):
    """复制文件夹"""
    try:
        shutil.copytree(src, dst)
        print(f"已复制文件夹: {src} → {dst}")
    except FileExistsError:
        print(f"目标已存在: {dst}")

def copy_file(src, dst):
    """复制文件(自动处理文件/文件夹目标)"""
    shutil.copy(src, dst)
    print(f"已复制文件: {src} → {dst}")

# --- 重命名/移动操作 ---
def move(src, dst):
    """移动/重命名文件或文件夹"""
    shutil.move(src, dst)
    print(f" 已移动: {src} → {dst}")

# --- 压缩操作 ---
def compress(src_dir, output_base, format='zip'):
    """压缩文件夹"""
    path = shutil.make_archive(output_base, format, src_dir)
    print(f"已压缩: {src_dir} → {path}")
    return path

# --- 解压操作 ---
def extract(archive_path, dest_dir=None):
    """解压文件(自动检测格式)"""
    if dest_dir is None:
        dest_dir = os.path.splitext(archive_path)[0]
    shutil.unpack_archive(archive_path, dest_dir)
    print(f" 已解压: {archive_path} → {dest_dir}")

3.3 sys

# 导入模块路径

import sys

print(sys.path)

3.4 random

import random

# 1. 获取范围内的随机整数
v = random.randint(10, 20)
print(v)

# 2. 获取范围内的随机小数
v = random.uniform(1, 10)
print(v)

# 3. 随机抽取一个元素
v = random.choice([11, 22, 33, 44, 55])
print(v)

# 4. 随机抽取多个元素
v = random.sample([11, 22, 33, 44, 55], 3)
print(v)

# 5. 打乱顺序
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(data)
print(data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值