Python基础语法文章导航:
- Python基础(01初识数据类型&变量)
- Python基础(02条件&循环语句)
- Python基础(03字符串格式化&运算符&进制&编码)
- Python基础(04 基础练习题)
- Python数据类型(day05整型&布尔类型&字符串类型)
- Python数据类型(06列表&元组)
- Python数据类型(07集合&字典&浮点型&None)
- Python文件操作01(自动化测试文件相关操作)
目录
(3)导入方法二,from xxxx import xxx:
前言
本文主要是讲解函数模块的一些知识。
一.自定义模块
1.模块和包
在开发简单的程序时,使用一个py文件就可以搞定,如果程序比较庞大,为了代码结构清晰,开发人员之间的分工,会将功能按照某种规则拆分到不同的py文件中,使用时再进行导入即可。或者,当其他的项目需要导入该项目的某些功能模块的时候,也可以进行导入,这样就极大的减少了代码的重复性,增加了可复用性。
在Python中一般对文件和文件的称呼(很多开发者的平时开发中也有人都称为模块)
-
一个py文件,模块(module)。
-
含多个py文件的文件夹,包(package)。
注意:在包(文件夹)中有一个默认内容为空的__init__.py
的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。
-
py2必须有,如果没有导入包就会失败。
-
py3可有可无。
2.导入
(1)导入的本质
将某个文件中的内容先加载到内存中,然后再去内存中拿过来使用。
(2)导入方法一,import xxxx:
import xxxx(一般多用于导入sys.path目录下的一个py文件),例如文件(模块)级别如下,如何在run.py文件中导入各py模块文件:
文件级别,导入文件的路径到最后一层文件::
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ ├── tencent
│ │ ├── __init__.py
│ │ ├── sms.py
│ │ └── wechat.py
│ └── utils.py
├── many.py
└── run.py
包级别,导入包的路径到最后一层包文件:
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
├── third
│ ├── __init__.py
│ ├── ali
│ │ └── oss.py
│ └── tencent
│ ├── __init__.py
│ ├── __pycache__
│ ├── sms.py
│ └── wechat.py
└── run.py
(3)导入方法二,from xxxx import xxx:
from xxxx import xxx【常用】,一般适用于多层嵌套和导入模块中某个成员的情况。
成员级别,from 导入文件路径到模块级别(py) import 该py文件里面的函数:
|── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
├── many.py
└── run.py
提示:基于from模式也可以支持 from many import *
,即:导入一个模块中所有的成员(可能会重名,所以用的少)。
模块级别,from 导入文件路径到包级别 import 对应py文件名字:
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ └── utils.py
├── many.py
└── run.py
包级别,from 外层包名 import 最里一层包名::
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ ├── tencent
│ │ ├── __init__.py
│ │ ├── sms.py
│ │ └── wechat.py
│ └── utils.py
├── many.py
└── run.py
3.相对导入,需要有包名称
from xxxx import xxx也支持相对导入:from 同文件目录下模块名py文件或上级文件目录下模块名py文件 import 模块中的方法,示例如下
相对导入只能用在包中的py文件中(即:嵌套在文件中的py文件才可以使用,项目根目录下无法使用)。
4.导入别名,as
如果项目中导入 成员/模块/包 有重名,那么后导入的会覆盖之前导入,为了避免这种情况的发生,Python支持重命名,即:
from xxx.xxx import xx as xo
import x1.x2 as pg
有了as的存在,让import xx.xxx.xxxx在调用执行时,会变得更加简单
原来:
import commons.page
v1=commons.page.pagination()
现在:
import commons.page as pg
v1 = pg.pagination()
5.主文件
主文件,其实就是在程序执行的入口文件,例如:
├── commons
│ ├── __init__.py
│ ├── convert.py
│ ├── page.py
│ ├── tencent
│ │ ├── __init__.py
│ │ ├── sms.py
│ │ └── wechat.py
│ └── utils.py
├── many.py
└── run.py
通常是执行 run.py 去运行程序,其他的py文件都是一些功能代码。当我们去执行一个文件时,文件内部的 __name__
变量的值为 __main__
,所以,主文件经常会看到:
import many
from commons import page
from commons import utils
def start():
v1 = many.show()
v2 = page.pagination()
v3 = utils.encrypt()
if __name__ == '__main__':
start()
只有是以主文件的形式运行此脚本时start函数才会执行,被导入时则不会被执行。
二.第三方模块
第三方模块(用别人写好并开源出来的py代码 )必须要先安装才可以使用。
1.只需要在自己终端执行: pip3 install 模块名称
2.如要指定版本则可以通过:pip3 install 模块名称==版本
3.pip想要升级为最新的版本例如:..../Versions/3.9/bin/python3.9 -m pip install --upgrade pip
4.pip默认是去
https://pypi.org
去下载第三方模块(本质上就是别人写好的py代码),国外的网站速度会比较慢,为了加速可以使用国内的豆瓣源。一次性使用:pip3.9 install 模块名称 -i https://pypi.douban.com/simple/
永久使用:
配置:
# 在终端执行如下命令 pip3.9 config set global.index-url https://pypi.douban.com/simple/ # 执行完成后,提示在我的本地文件中写入了豆瓣源,以后再通过pip去安装第三方模块时,就会默认使用豆瓣源了。 # 自己以后也可以打开文件直接修改源地址。 Writing to /Users/wupeiqi/.config/pip/pip.conf #再进行下载 pip3.9 install 模块名称
5.也可以有其他的下载源进行使用:
阿里云: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/
三.内置模块
1.os
import os
# 1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(abs_path)
"""
# 2. 获取当前文件的上级目录
"""
base_path = os.path.dirname( os.path.dirname(路径))
print(base_path)
"""
# 3. 路径拼接
"""
p1 = os.path.join(base_path, 'xx')
print(p1)
p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(p2)
"""
# 4. 判断路径是否存在
"""
exists = os.path.exists(p1)
print(exists)
"""
# 5. 创建文件夹
"""
os.makedirs(路径)
"""
"""
path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
os.makedirs(path)
"""
# 6. 是否是文件夹
"""
file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')
is_dir = os.path.isdir(file_path)
print(is_dir) # False
folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True
"""
# 7. 删除文件或文件夹
"""
os.remove("文件路径")
"""
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""
-
listdir,查看目录下所有的文件
-
walk,查看目录下所有的文件(含子孙文件)
import os """ data = os.listdir("/Users/wupeiqi/PycharmProjects/luffyCourse/day14/commons") print(data) # ['convert.py', '__init__.py', 'page.py', '__pycache__', 'utils.py', 'tencent'] """ """ 要遍历一个文件夹下的所有文件,例如:遍历文件夹下的所有mp4文件 """ data = os.walk("/Users/wupeiqi/Documents/视频教程/路飞Python/mp4") for path, folder_list, file_list in data: for file_name in file_list: file_abs_path = os.path.join(path, file_name) ext = file_abs_path.rsplit(".",1)[-1] if ext == "mp4": print(file_abs_path)
2.shutil
import shutil
# 1. 删除文件夹
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""
# 2. 拷贝文件夹
"""
shutil.copytree("/Users/wupeiqi/Desktop/图/csdn/","/Users/wupeiqi/PycharmProjects/CodeRepository/files")
"""
# 3.拷贝文件
"""
shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/")
shutil.copy("/Users/wupeiqi/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/x.png")
"""
# 4.文件或文件夹重命名
"""
shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/xxxx.png")
shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/files","/Users/wupeiqi/PycharmProjects/CodeRepository/images")
"""
# 5. 压缩文件
"""
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
"""
# shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')
# 6. 解压文件
"""
# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
"""
# shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')
3.sys
import sys
# 1. 获取解释器版本
"""
print(sys.version)
print(sys.version_info)
print(sys.version_info.major, sys.version_info.minor, sys.version_info.micro)
"""
# 2. 导入模块路径
"""
print(sys.path)
"""
-
argv,执行脚本时,python解释器后面传入的参数
import sys
print(sys.argv)
# [
# '/Users/wupeiqi/PycharmProjects/luffyCourse/day14/2.接受执行脚本的参数.py'
# ]
# [
# "2.接受执行脚本的参数.py"
# ]
# ['2.接受执行脚本的参数.py', '127', '999', '666', 'wupeiqi']
# 例如,请实现下载图片的一个工具。
def download_image(url):
print("下载图片", url)
def run():
# 接受用户传入的参数
url_list = sys.argv[1:]
for url in url_list:
download_image(url)
if __name__ == '__main__':
run()
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)
5.hashlib
hashlib
是 Python 标准库中的一个模块,用于提供各种安全哈希和消息摘要算法。这个模块可以用来创建哈希对象,通过这些对象可以生成文件或数据块的哈希值,常用于数据的完整性验证和密码学应用。
import hashlib
#hashlib.md5()、hashlib.sha256() 创建了 MD5 和 SHA-256 的哈希对象
hash_object = hashlib.md5()
hash_object.update("武沛齐".encode('utf-8'))
result = hash_object.hexdigest()
print(result)
#17351012472429d52d0c0d23d468173d
import hashlib
hash_object = hashlib.md5("iajfsdunjaksdjfasdfasdf".encode('utf-8'))
hash_object.update("武沛齐".encode('utf-8'))
result = hash_object.hexdigest()
print(result)
#ff533a063c4ae507be583841e6576829
6.configparser
见Python文件操作02(自动化测试文件相关操作)Python文件操作01(自动化测试文件相关操作)Python文件操作02(自动化测试文件相关操作)中的XML内容
7.xml
见Python文件操作02(自动化测试文件相关操作)中的XML内容
8.json
json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。
json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)
# Python中的数据类型的格式
data = [
{"id": 1, "name": "武沛齐", "age": 18},
{"id": 2, "name": "alex", "age": 18},
('wupeiqi',123),
]
# JSON格式
value = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18},["wupeiqi",123]]'
(1)JSON格式的作用
跨语言数据传输,例如:
A系统用Python开发,有列表类型和字典类型等。
B系统用Java开发,有数组、map等的类型。语言不同,基础数据类型格式都不同。
为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。
(2)Python数据类型与json格式的相互转换:
(a)数据类型 -> json ,一般称为:序列化
import json
data = [
{"id": 1, "name": "武沛齐", "age": 18},
{"id": 2, "name": "alex", "age": 18},
]
res = json.dumps(data)
print(res) # '[{"id": 1, "name": "\u6b66\u6c9b\u9f50", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
res = json.dumps(data, ensure_ascii=False)
print(res) # '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
(b)json格式 -> 数据类型,一般称为:反序列化
import json
data_string = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'
data_list = json.loads(data_string)
print(data_list)
#[{'id': 1, 'name': '武沛齐', 'age': 18}, {'id': 2, 'name': 'alex', 'age': 18}]
(3)类型要求
python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
data = [
{"id": 1, "name": "武沛齐", "age": 18},
{"id": 2, "name": "alex", "age": 18},
]
其他类型如果想要支持,需要自定义JSONEncoder
才能实现,例如:
import json
from decimal import Decimal
from datetime import datetime
data = [
{"id": 1, "name": "武沛齐", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
{"id": 2, "name": "alex", "age": 18, 'size': Decimal("9.99"), 'ctime': 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)
res = json.dumps(data, cls=MyJSONEncoder,ensure_ascii=False)
print(res)
#[{"id": 1, "name": "武沛齐", "age": 18, "size": "18.99", "ctime": "2024-39-27"}, {"id": 2, "name": "alex", "age": 18, "size": "9.99", "ctime": "2024-39-27"}]
(4)其他功能
json模块中常用的是:
-
json.dumps
,序列化生成一个字符串。 -
json.loads
,发序列化生成python数据类型。 -
json.dump
,将数据序列化并写入文件(不常用) -
import json data = [ {"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}, ] file_object = open('xxx.json', mode='w', encoding='utf-8') json_data=json.dump(data, file_object) print(json_data) file_object.close() #None
-
json.load
,读取文件中的数据并反序列化为python的数据类型(不常用)import json file_object = open('xxx.json', mode='r', encoding='utf-8') data = json.load(file_object) print(data) file_object.close() #[{'id': 1, 'name': '武沛齐', 'age': 18}, {'id': 2, 'name': 'alex', 'age': 18}]
总结:
能够深入理解,在项目编码中能够运用本章知识即可。