模块:按照功能划分抽象出的py文件。分为内置模块 & 自定义的功能模块 & 第三方模块。
包:文件夹。包含多个py文件的文件夹。
默认情况下Python导入的模块或者包所在的路径:
- 运行文件所在的同级目录。
- 模块和包在Python的安装目录【内置模块或者包所在的路径】。
import sys
print(sys.path) # python内部默认从 sys.path 路径中查找模块
"""
# 列表有序:当前路径下找到目标模块则放弃继续往后搜索
['/Users/zhfeng/mayun/python',
'/Users/zhfeng/mayun/python',
'/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python38.zip',
'/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8',
'/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload',
'/Users/zhfeng/mayun/python/.venv/lib/python3.8/site-packages'
]
"""
如果方便Python引入其他路径下的模块xxx,则需要:
sys.path.append("自定义路径")
import xxx
自定义的模块名不能与内置模块、三方模块名冲突,否则无法运行。
模块和包导入方式:
- import导入:只能导入py文件。
- from导入:导入模块和包的某个函数【py文件中函数】。
1.第三方模块
1.1.requests
2.常见的内置模块
2.1.hashlib
hashlib 加密模块,例如MD5加密:
import hashlib
salt = "iij"
md5 = hashlib.md5(salt.encode("utf-8")) # 加盐:撞库原因。即将常见的密码对应的md5值提前计算维护好,挨着试每一个可能
md5.update("admin".encode("utf-8"))
hv = md5.hexdigest()
2.2.json格式
序列化:当前语言格式 -> JSON格式。
反序列化:JSON格式 -> 当前语言理解的格式。
import json
info = {"username":"张三","age":23,"idList":[1,2,4]}
#序列化
jsonV = json.dumps(info)
print(jsonV)
#反序列化
pyV = json.loads(jsonV)
print(pyV["idList"][0],pyV["idList"][1],pyV["idList"][2])
Python中默认只能通过json模块序列化基本的数据类型,基本数据类型包含:
+---------------+-------------------+ | JSON | Python | +===============+===================+ | object | dict | +---------------+-------------------+ | array | list | +---------------+-------------------+ | string | str | +---------------+-------------------+ | number (int) | int | +---------------+-------------------+ | number (real) | float | +---------------+-------------------+ | true | True | +---------------+-------------------+ | false | False | +---------------+-------------------+ | null | None | +---------------+-------------------+
2.3.Time
import time
print(time.time()) # 时间戳,自1970以来距今的秒数
import datetime
# datetime -> 字符串
dt = datetime.datetime.now()
dtStr = dt.strftime("%Y-%m-%d %H:%M:%S")
#字符串 -> datetime
dStr = "2025-04-01"
dtime = datetime.datetime.strptime(dStr,"%Y-%m-%d")
print(dtime,type(dtime))
#datetime -> 时间戳
now = datetime.datetime.now()
print(now.timestamp())
#时间戳 -> datetime
ctime = time.time()
cDtime = datetime.datetime.fromtimestamp(ctime)
print(type(cDtime))
now = datetime.datetime.now()
# timedelta 两个日期之间的差异
print(now + datetime.timedelta(days=10))
2.4.OS模块
import os
#拼接路径
print(os.path.join("x1","x2")) #x1/x2
file_path = "/x1/x2/x3/a.txt"
#查找当前文件|目录的父级目录
print(os.path.dirname(file_path))
#绝对路径
print(os.path.abspath("xx"))
2.5.shutil
- rmtree:删除文件夹【不能删除文件】。
- copytree:拷贝文件夹。
- copy:拷贝文件。
- make_archive:压缩文件。
- unpack_archive:解压压缩包。
import shutil
#删除文件夹:删除xxx文件夹
shutil.rmtree("xx/xxx")
#拷贝文件夹:将当前文件夹下所有内容【文件夹 + 文件】拷贝至目标文件下。此时目标文件夹不能存在,否则报错
shutil.copytree("xx/xxx","x")
#拷贝文件
"""
1.存在文件夹x,则直接将文件拷贝至文件夹x下。
2.不存在文件夹x,则直接创建文件x,并且将原文件内容写到文件x中
"""
shutil.copy("xx/xxx/a.txt","x")
# 这种方式拷贝的前提:必须存在文件夹x,否则报错
shutil.copy("xx/xxx/a.txt","x/")
2.6.正则表达式re
import re
text = "我正在学习Python正则表达式,我的联系方式13439216789,邮箱为3243214314@qq.com,到时请准时联系"
t = re.findall("1[3|5|8|9]\d{9}",text)
r'a.*b$':r表示该字符串是一个原始字符串(raw string)。在正则pattern中如果存在\d、\s等标识时默认会被转义,加上标识“r”则不会被转义。
2.6.1.语法
\w:一个字母 or 数字 or 下划线,包含汉字。
# ['垃圾0买空卖空垃圾0就可健康好']
print(re.findall("垃圾\w+好","垃圾0买空卖空垃圾0就可健康好"))
\d:一个数字。
.:除换行符之外的任意字符。
\s:任意一个空白字符。
^a ... b$:候选字符串必须是以a开头,b结束。
print(re.findall("a\w+\s\w+","root admin add again")) #['admin add']
2.6.1.1.固定文本
正则模式为一段文本,即精确匹配。
text = "我正在学习Python正则表达式,我的联系方式13439216789,邮箱为3243214314@qq.com,到时请准时联系"
print(re.findall("我的联系方",text))
2.6.1.2.匹配字符
import re
text = "我正在学习Python正则表达式,akmbkq,我的联系方式13439216789,邮箱为3243214314@qq.com,fnjqawcjfe到时请准时联系。"
# 中括号:匹配括号内任一字符
print(re.findall("[abc]",text))
2.6.1.3.匹配范围
范围表示方式:a-z;0-9。
text = "我pa正在学习Python正则表达式,akmbkq,我的联系方式13439216789,邮箱为3243214314@qq.com,fnjqawcjfe到时请准时联系我9。"
# 匹配规范:我 + a-z中任一字符
print(re.findall("我[a-z]",text))
print(re.findall("我[0-9]",text))
2.6.1.4.次数
+:1个 or n个。
*:0个 or n 个。
?:0个 or 1个。
{n}:固定n个。
{n,}:至少n个。
{n,m}:n ~ m 个。
2.6.1.5.贪婪匹配 & 非贪婪匹配
# 贪婪匹配:尽可能多的去匹配 结果:['垃圾0买好空卖空垃圾0就可健康好']
print(re.findall("垃圾\w+好","垃圾0买好空卖空垃圾0就可健康好"))
# 非贪婪匹配:找到第一个匹配就不会再继续了。 结果:['垃圾0买好', '垃圾0就可健康好']
# 非贪婪匹配中“?”并非是指0个或者1个,而是控制非贪婪方式。即次数 n(n表示匹配多次) + ? 方式表示非贪婪模式
print(re.findall("垃圾\w+?好","垃圾0买好空卖空垃圾0就可健康好"))
问题:正则匹配是贪婪模式,如何改成非贪婪模式?答:正则中添加一个?。
2.6.2.分组
按照语法规范正常匹配,其最终结果为正确结果的部分内容。
text = "我pa正在学习Python正则表达式,akmbkq,我的联系方式13498746789,邮箱为3243214314@qq.com,18498746789到时请准时联系我9。"
# ['13439216789', '18439216789']
print(re.findall("1[3|8|9]\d{9}",text))
# ['439216789', '439216789']
print(re.findall("1[3|8|9](\d{9})",text))
# [('134', '6789'), ('184', '6789')]
print(re.findall("(1\d{2})9874(\d{4})",text))
通过“元组”格式分割最后结果。但“()”并不参与匹配过程,只影响最终结果返回内容。
2.6.3.提取数据区域+|
text = "我pa正在学习Python1垃圾 90正则表达式,akmbkq,我的联系方式13498746789,邮箱为3243214314@qq.com,18498746789到时请准时联系我9。"
# ['垃圾 9', '34', '43', '84']
print(re.findall("1(\d{2}|垃圾\s9)",text))
|:表示或,即 | 前后均可以匹配规则。
2.6.4.match vs search之间的区别
# match:从开头进行匹配,开头匹配失败则放弃匹配,否则返回第一个候选字符串。匹配成功返回一个对象
t = re.match("逗\dB","逗2B 逗9B")
if t:
# 通过group获取结果:逗2B
print(t.group())
# search:从前往后一次查找,只要找到第一个则放弃继续匹配。
t = re.search("逗\dB","12逗8B 逗7B")
if t:
# 通过group获取结果:逗8B
print(t.group())
2.6.5.基于正则进行分割split
3.主文件
def run():
print("run...")
# __name__ 是python内置的一个变量
"""
__main__:只有执行当前脚本(.py文件)时__name__才等于__main__
如果当前脚本被其他脚本导入import,则执行其他脚本时,触发当前脚本执行,此时内置变量 __name__ 为当前脚本名,非__main__
这样避免其他脚本触发程序执行。
备注:只有显示运行当前脚本才可以触发程序执行
"""
print(__name__)
if __name__ == '__main__':
run()
__name__:该变量是Python运行时内部默认生成的。只有执行【非导入】该文件时,Python内部为该变量赋值为:__main__。

被折叠的 条评论
为什么被折叠?



