3.Python模块&包

模块:按照功能划分抽象出的py文件。分为内置模块 & 自定义的功能模块 & 第三方模块。

包:文件夹。包含多个py文件的文件夹。

默认情况下Python导入的模块或者包所在的路径:

  1. 运行文件所在的同级目录。
  2. 模块和包在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__。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值