python
文章目录
- 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)