14python模块

python


文章目录


前言

模块和包、导入、内置模块


一、自定义模块

1.导入项目结构

  • windows下用命令:把项目的结构导入到a.txt中
tree D:\light_gpt2 > D:a.txt

效果是这样的

├── commons
│   ├── __init__.py
│   ├── temporary.py
│   ├── model.py
│   ├── tencent
│   └── utils.py
├── data.py
└── gpt2.py
  • 包通俗的理解就是文件夹,模块就是.py文件
    包中通常有一个默认内容为空的__init__.py文件,描述当前包的信息,如版本号之类,导入包下的模块时,该文件会自动加载。python2必须有这个文件,否则报错,而python3不必有。

2.python模块默认路径

  • sys模块查看默认的模块路径,存在这个路径的包可以直接导入使用
import sys
print(sys.path)
  • 在系统中添加路径
sys.path.append("路径")

import module  # 导入路径下的一个module.py文件
  • 写模块名称不能和内置模块、第三方模块同名,否则会覆盖

3.导入嵌套文件的模块

如在run.py中引用commons中的模块时,需要在sys.path中添加路径

├── commons
│   ├── __init__.py
│   ├── temporary.py
│   ├── model.py
│   ├── tencent
│   └── utils.py
├── pro
│   └── run.py
└── gpt2.py
import os
import sys
# 把当前文件的上2级目录路径加在系统中
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

4.导入的方式

  • import xxxx 导入一个py文件
  • import xxxx.xxxx 导入包下的py文件 代码中使用的时候须带包和模块名字,如xxxx.xxxx.function()
  • from xxx import xxx
  • from xxx import * 导入其下的所有模块
  • from xxx import xxx支持相对导入,.表示当前目录,…表示上一级的目录,如run.py中
from ..commons.utils import utils中的方法
  • 导入别名
    避免重名
from matplotlib import pyplot as plt
import xxx.xxx as xx

5.name

  • .py本文中执行时__name__=“main”。
  • 导入.py文件中的__name__=它的模块名,也就是文件名称。
# 程序的入口,执行函数。仅定义函数,没有执行函数的.py文件通常不是程序入口
if __name__ == '__main__':
    start()

二、第三方模块

1.pip安装

  • pip和pip3是python自带的包安装工具win下的默认安装目录C:\Python39\Scripts\pip3.exe
pip3 install 模块名称
# 指定版本
pip install numpy==2.2

2.镜像源

pip默认到https://pypi.org 下载第三方模块,该网址在国外,下载很慢,可以切换国内镜像源。

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

在配置文件中加入镜像

# 在终端执行如下命令加入豆瓣源,以后就默认到豆瓣源上找模块并安装
pip3.9 config set global.index-url 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/

  • 包默认安装的路径
#Windows系统:
C:\Python39\Lib\site-packages\

3.源码安装

  • 下载源码(zip、tar、tar.gz)并解压
  • 在包的路径下执行编译和安装命令
python setup.py build
python setup.py install

4.wheel安装第三方包

  • 安装wheel:pip install wheel
  • 下载第三方.whl包
  • 进入包的目录进行安装
pip install xxxx.whl
  • 安装的包通常在C:\Python\Lib\site-packages(Windows系统)
  • sys.path获取这个目录

三、内置模块

1.os

获取当前绝对路径

present_path = os.path.abspath(__file__)
print(present_path)

获取当前文件的某级目录

import os

# 当前文件的上级目录
present_path = os.path.dirname(__file__)
print(present_path)
# 当前文件的上上级目录(文件夹)
parent_dir = os.path.dirname(os.path.dirname(__file__))
print(parent_dir)

拼接路径

import os

# 当前文件的上级目录 当前file的路径是E:/light_gpt2
present_path = os.path.dirname(__file__)
print(present_path) # E:/light_gpt2

path1 = os.path.join(present_path, '文件夹2')
print(path1) # E:/light_gpt2\文件夹2

path2 = os.path.join(present_path, '文件夹1', '文件夹2', '美食.jpg')
print(path2) # E:/light_gpt2\文件夹1\文件夹2\美食.jpg

路径是否存在

import os

path2 = os.path.exists(r'E:/light_gpt2')
print(path2)

创建文件夹

import os

path1 = "E:/light_gpt2"
# 判断文件夹是否存在,若不存在,则创建
path2 = os.path.join(path1, '文件夹1', '文件夹2')
if not os.path.exists(path2):
    os.makedirs(path2)

是否是文件夹

import os

present_path = os.path.dirname(__file__)
file1 = os.path.join(present_path, 'aa', 'bb', 'cc.txt')
dir_not = os.path.isdir(file1)
print(dir_not) # False

folder1 = os.path.join(present_path)
dir_not2 = os.path.isdir(folder1)
print(dir_not2) # True

删除文件或文件夹

import os
import shutil

present_path = os.path.dirname(__file__)
path2 = os.path.join(present_path, '文件夹1', 'a.txt')
if not os.path.exists(path2):
    os.makedirs(path2)
    print("创")

if os.path.exists(path2):
    os.remove(path2)  # 删文件
    print("删")
# if os.path.exists(path2):
#     shutil.rmtree(path2)  # 删文件夹
#     print("删")

查看目录下的文件夹和文件

import os
# 以列表形式显示light_gpt2文件夹下所有的文件夹和文件,包括隐藏的,但是不会查看孙辈文件夹及文件
data = os.listdir("E:/light_gpt2")
print(len(data))
print(data)

查看目录下所有的文件和文件夹


import os

# 返回一个生成器
data = os.walk("E:/light_gpt2")
print(data)
# 返回E:/light_gpt2路径下的所有文件和文件夹
# 返回:E:/light_gpt2路径,本路径下文件夹,本路径下的文件
# 如果文件夹中有文件,依以方式递归展开
for path, folders, files in data:
    print(path,folders,files)
    print('*'*50)
    for file_name in files:
        file_path = os.path.join(path, file_name)
        postfix = file_path.rsplit(".",1)[-1]
        if postfix == "py":
            # print(file_path)
            pass

2.shutil文件(夹)的高级操作

删除文件夹

shutil.rmtree(path2)

拷贝文件(夹)

import os
import shutil

present_path = os.path.dirname(__file__)
path1 = os.path.join(present_path, '海边')
path2 = os.path.join(present_path, '文件夹1')
# 把path2内的东西拷到path1中
shutil.copytree(path2, path1)
import os
import shutil

present_path = os.path.dirname(__file__)
file1 = os.path.join(present_path, '文件夹1','海边.jpg')
file2 = os.path.join(present_path, '文件夹1','2.jpg')
# 把file1复制并重新命名到file2
shutil.copy(file1, file2)

文件(夹)重命名

import os
import shutil

present_path = os.path.dirname(__file__)
file1 = os.path.join(present_path, '文件夹1','海边.jpg')
file2 = os.path.join(present_path, '文件夹1','2.jpg')
# 把file1重命名为file2
shutil.move(file1, file2)
import os
import shutil

present_path = os.path.dirname(__file__)
file1 = os.path.join(present_path, '文件夹1')
file2 = os.path.join(present_path, '文件夹2')
# 把文件夹folder1重命名为folder2
shutil.move(file1, file2)

压缩文件

import os
import shutil

present_path = os.path.dirname(__file__)
file2 = os.path.join(present_path, '文件夹2')
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
shutil.make_archive(base_name=r'condense',format='zip',root_dir=file2)

解压文件

import shutil

# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
shutil.unpack_archive(filename=r'condense.zip', extract_dir=r'E:\light_gpt2\海边', format='zip')

3. sys

解释器版本

sys.version
sys.version_info
sys.version_info.major
sys.version_info.minor
sys.version_info.micro
sys.path

接收角本参数

  • sys.argv

以列表形式接收参数
命令行中运行角本时输入一些参数,这些参数被argv接收。

# test.py及之后的参数被argv以列表形式接收
python test.py

模块路径

  • sys.path

4.random

获取范围内的随机整数

import random

a = random.randint(1, 30)
print(a)

获取范围内的随机小数

import random

a = random.uniform(1, 30)
print(a)

抽取一个元素

import random

a = random.choice([78, 85, 36, 24, 99])
print(a)

抽取多个元素

import random

a = random.sample([78, 85, 36, 24, 99], 2)
print(a)

洗牌

import random

a1 = [78, 85, 36, 24, 99]
random.shuffle(a1)
print(a1)

5.hashlib

加密数据

import hashlib

# 加把盐
encryption = hashlib.md5("sdbtedfdf".encode('utf-8'))
encryption.update("张三".encode('utf-8'))
res = encryption.hexdigest()
print(res)

6.json

  • python的数据与json格式相互转化
  • 各种语言系统之间通过json传递数据

支持的python数据类型

    +-------------------+---------------+
    | Python            | JSON          |
    +===================+===============+
    | dict              | object        |
    +-------------------+---------------+
    | list, tuple       | array         |
    +-------------------+---------------+
    | str               | string        |
    +-------------------+---------------+
    | int, float        | number        |
    +-------------------+---------------+
    | True              | true          |
    +-------------------+---------------+
    | False             | false         |
    +-------------------+---------------+
    | None              | null          |
    +-------------------+---------------+

序列化

  • python数据 --> json
import json

python_data = [
    {"id": 1, "name": "武大", "age": 3},
    {"id": 2, "name": "熊二", "age": 2},
]

results = json.dumps(python_data)
print(results)
# [{"id": 1, "name": "\u6b66\u5927", "age": 3}, {"id": 2, "name": "\u718a\u4e8c", "age": 2}]

results = json.dumps(python_data, ensure_ascii=False)
print(results)
# [{"id": 1, "name": "武大", "age": 3}, {"id": 2, "name": "熊二", "age": 2}]

反序列化

  • json格式 -> python数据
import json

data_json = '[{"id": 1, "name": "武大", "age": 3}, {"id": 2, "name": "熊二", "age": 2}]'
data_python = json.loads(data_json)

print(data_python)

其他类型转json

  • 需要自定义JSONEncoder才能实现
import json
from decimal import Decimal
from datetime import datetime

dic1 = [
    {"id": 1, "name": "熊大", "age": 3, 'height': Decimal("20.36"), 'date': datetime.now()},
    {"id": 2, "name": "熊二", "age": 4, 'height': Decimal("15.65"), 'date': datetime.now()},
]

class MyJSONEncoder(json.JSONEncoder):
    def default(self, o):
        if type(o) == Decimal:
            return str(o)
        elif type(o) == datetime:
            return o.strftime("%Y-%M-%d")
        return super().default(o)

json_data = json.dumps(dic1, cls=MyJSONEncoder,ensure_ascii=False)
print(json_data)

dumps\loads与dump\load

json.dumps 序列化生成一个字符串
json.loads 序列化生成python数据类型
json.dump 数据序列化并写入文件
json.load 读取文件中的数据并反序列化为python的数据类型

json.dump

import json

dic1 = [
    {"id": 1, "name": "熊大", "age": 3},
    {"id": 2, "name": "熊二", "age": 4}
]


file1 = open('xxx.json', mode='w', encoding='utf-8')

json.dump(dic1, file1)

file1.close()

json.load

import json


file1 = open('xxx.json', mode='r', encoding='utf-8')

data = json.load(file1)
print(data)

file1.close()

7.time和datetime

  • UTC/GMT:世界时间

  • 本地时间:本地时区的时间

time

import time

# 时间戳自1970-1-1 00:00
a1 = time.time()
print(a1)

# 时区,秒数,
a2 = time.timezone
print(a2/60/60)  #东八区

print("睡3秒")
# 睡3秒,再执行
time.sleep(3)
print("醒了")

datetime

from datetime import datetime, timezone, timedelta

time_1 = datetime.now()  # 当前本地时间
print(time_1)

tz = timezone(timedelta(hours=8))  # 东8区时间
print(tz)
time_2 = datetime.now(tz)
print(time_2)

time_3 = datetime.utcnow()  # 当前UTC时间
print(time_3)

timedelta

  • datetime类型可以 +- timedelta类型
from datetime import datetime, timedelta

time_1 = datetime.now()
print(time_1)

# timedelta参数设置天等进行加减
time_2 = time_1 + timedelta(days=88, minutes=9)
print(time_2)
  • datetime类型 - datetime类型,相减的结果是时间间隔,但不能相加
在这里插入代码片

字符串格式的时间 <-----> datetime格式时间

from datetime import datetime, timedelta

# 字符串格式的时间  ---> datetime格式时间
text = "2022-2-2"
time_1 = datetime.strptime(text,'%Y-%M-%d') # %Y 年,%m,月份,%d,天。
print(time_1)

# datetime格式时间 ----> 字符串格式的时间
time_2 = datetime.now()
time_al = time_2.strftime("%Y-%m-%d %H:%M:%S")
print(time_al)

time格式 <------> datetime格式

import time
from datetime import datetime, timedelta

# time格式 --> datetime格式
time_1 = time.time()
print(time_1)
datetime1 = datetime.fromtimestamp(time_1)
print(datetime1)
print("*"*50)

# datetime格式 ---> time格式
datetime2 = datetime.now()
print(datetime2)
time_2 = datetime2.timestamp()
print(time_2)
上一篇:docker导出和导入自己生成的镜像


下一篇:Android 11 分区存储图片裁剪上传异常问题