模块: 定义模块时可以把一个py文件或者一个文件夹(包)称为模块,
包:里面得有__init__.py 文件
模块的导入:
1: 执行的脚本和所需导入的模块在同一目录下时,且需要模块里的很多功能: import 模块 (as 别名) 模块.函数()
2: from 模块 import 模块 (as 别名) 模块.函数()
3: from 模块.模块 import 函数 函数()
__file__为执行脚本时后面的参数,可能给你的是相对路径或绝对路径 具体情况看在终端python解释器后面的路径名(参数),这里通过 os.path.abspath(__file__)将其统一转换为绝对路径
脚本运行查找的路径(相对路径):
1.若不写绝对路径(即使用相对路径),Python 会默认从脚本运行时的“当前工作目录” 开始查找文件。
如
D:/project/
├─ my_script.py (你的压缩脚本)
└─ data/
└─ target.txt (待压缩的文件)
- 若在 D:/project/ 目录下运行 my_script.py ,脚本中用 data/target.txt 这种相对路径,就能找到文件(因为当前工作目录是 D:/project/ )。
- 若在 D:/ 目录下运行 my_script.py (比如执行 python project/my_script.py, 此时_ _file_ _为 project/my_script.py),再用 data/target.txt 就会找不到文件(此时当前工作目录是 D:/ ,而非 D:/project/ ),即便 sys.path 包含 D:/project/ 也没用。
sys模块:
sys.exit(0) : 结束脚本
sys.argv() : 获取用户输入的参数 以列表存储,sys.argx[0]为脚本文件
import sys
if len(sys.argv) < 2:print("参数不够")exit(0)
print(sys.argv[1])
sys.path : 默认脚本导入模块时,按照sys.path中的路径取查找相应的模块(环境变量)
返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
import sys
for i in sys.path:print(i)#导入模块时,按照这里面的路径去找
"""
d:\test\file1D:\Python37\python37.zip
D:\Python37\DLLs
D:\Python37\lib
D:\Python37
D:\Python37\lib\site-packages
"""##情况1: 导入test文件夹下面file1文件夹中file_test1文件夹中的a.py模块#由于sys.path中有 d:\test\file1 路径则导入时可以继续按这个路径继续往下找到file_tset1文件中的a.py模块
#方法一:
import file1_test1.a
#方法二:
from file1_test1 import a
#方法三:(导入模块中某个函数
from file1_test1.a import func##情况2: 导入test文件夹下面file2中test2.py模块#由于file2在test文件夹下,且sys.path中没有D:\test,所以要在sys.path中添加环境变量去找到file2#第一步:由于file2和运行的脚本在同一test文件中所以得获取当前脚本的绝对路径,得到其共同的目录
import os
a = os.path.dirname(os.path.abspath(__file__)) #得到D:\test __file__当前脚本的路劲,可能给到的是绝对路径或相对路径
sys.path.append(a)#将此路径添加到sys.path中,以便找到模块
#第二步:导入模块
#方法一:(将file2中test2.py模块全导入
import file2.test2
from file2 import test2
#方法二:(导入个别函数
from file2.test2 import func2
shutil模块: 用于高级的文件操作和目录处理
shutil.rmtree(path) : path得是其绝对路径 递归删除整个文件目录,不可以是文件(删除单个文件用os.remove)
#删除整个目录脚本
import sys,shutil
def get_file_path(path):file_path = sys.argv[1]shutil.rmtree(file_path)
######
import shutil
shutil.rmtree(r'D:\guohan\code\模块\fsa')
shutil.move():重命名并移动(优先于os.rename) 不仅可以重命名还可以移动位置, 要重命名的文件路径得指明(不和脚本在同一目录下时) 重命名后的文件路径也得指明 不然会添加到脚本所在的目录下,指明了路径即使不和脚本在同一目录也能找到并重命名和移动位置
import shutil
shutil.move(r'D:\guohan\code\函数','hanshu')
import shutil
shutil.move(r'D:\guohan\code\模块\hanshu',r'D:\guohan\code\函数')
##文件路径写全不然还是只改在模块下
shutil.make_archive: 压缩文件 格式:shutil.make_archive(要压缩后的名字(可以含路径指定去哪,不然压缩到脚本所在目录),压缩包格式(如zip),要压缩的文件(指定绝对路径,以找到))
shutil.unpack_archive: 解压文件 格式:shutil.unpack_archive(要解压包的名字(同样的有路径,因为先从sys,path里面找,没有则报错), 要解压的路径(若没有该文件夹自动创建),压缩包的格式)
random模块:
random.randint(a,d) : 生成[a,b]间的整数
#随机验证码
import random
none_list = []
for i in range(6):data = random.randint(65,90)none_list.append(chr(data))
print("".join(none_list))
getpass模块:
getpass.getpass() : 密码不显示
#密码不显示
import getpass
pwd = getpass.getpass('输入密码:')
print(pwd)
hashlib模块:
hashlib。md5() : md5密码加密
#md5密码加密
import hashlib
def md5_pwd(pwd):#加盐obj = hashlib.md5('hkhsdkfhjksdh'.encode('utf-8')) #将字符串以utf-8编码进行压缩(二进制->为字节)obj.update(pwd.encode('utf-8')) #将密码以utf-8编码进行压缩后加到所加的盐后面进行加密data = obj.hexdigest() #将加密的obj(二进制形式)转成字符串return data
num = input("输入密码:")
print(md5_pwd(num))
os模块:
1.os.stst(file).st_size: 读取文件大小
2.os.path.exists(path): 判断路径是否存在 存在返回True 不存在返回False
3.os.path.abspath(): 获取绝对路径,其不关心文件是否存在直接将文件拼接到脚本运行目录后 ,代表脚本运行的目录(即正处目录) ..代表上级目录
4.os.path.dirname(): 获取路径的上一级目录名
5.os.path.join(): 对路径进行拼接
6.os.listdir(path): 查看该目录下第一层文件
7。os.walk(path): 查案看该目录所有层的所有文件 会生成一个生成器得循环去查看 a 为查看的目录 b 为此目录下的文件夹 c为此目录下的文件
8.os.makedirs(): 创建目录和子目录
9.os.remove(): 删除单个文件
10.os.rename(): 重命名
json,pickle模块: json是数据交换的格式,所有语言通用,是一种特殊的字符串,所有语言都认识的格式
pickle只有python用
json格式字符串最外层只能是[...]或者{...} 里面则是被序列化的对象若里面有字符串则必须是”“
pickle格式为二进制的字节流
序列化:python对象(除集合)——>json格式,pickle格式 dumps/dump json.dumps->str pickle.dumps->bytes
反序列化:json格式——>python对象 loads/load
注意:python中集合不可以转换成json格式
python中元组转成json格式为[...] 反序列化时由于json里面没有元组所以得到的python对象没有元组
pthon对象中含有中文序列化时得有json.dumps(v,ensure_ascii=False)
####序列化
import json
v = [1,'guohan','郭晗',(2,3),{'4':5}]
v1 = json.dumps(v)
print(v1)
>>>[1, "guohan", "\u90ed\u6657", [2, 3], {"4": 5}]import json
v = [1,'guohan','郭晗',(2,3),{'4':5}]
print(v,type(v))
v1 = json.dumps(v,ensure_ascii = False)
print(v1,type(v1))
>>>
[1, 'guohan', '郭晗', (2, 3), {'4': 5}] <class 'list'>
[1, "guohan", "郭晗", [2, 3], {"4": 5}] <class 'str'>
import json
v = '[1,"guohan","郭晗",[2,3],{"4":5}]' ##json 格式的字符串
print(v,type(v))
v1 = json.loads(v)
print(v1,type(v1))
>>>
[1,"guohan","郭晗",[2,3],{"4":5}] <class 'str'>
[1, 'guohan', '郭晗', [2, 3], {'4': 5}] <class 'list'>
time模块:
1.time.time(): 时间戳
2.time.sleep(): 程序暂停的秒数
import time
def wrapper(param):def inner(*a,**kwa):v1 = time.time()for i in range(3):time.sleep(2)print(i)param(*a,**kwa)v2 = time.time()print(v2-v1)return inner
@wrapper
def func():print("func函数")
func()
>>>
0
1
2
func函数
6.014153003692627
3.time.strftime('%Y-%m-%d'): 格式化的字符串
import time
a = time.strftime('%Y-%m-%d')
print(a)
>>>2025-10-06
datetime模块:
1.datetime.now(): 获取当地时间(datatime类型) >>>2025-10-06 18:39:28.716035
2.datetime.utcnow(): 获取世界时间
sttr time datetime 三者转换关系: datetime 为中间枢纽 其可以进行时间的加减
datetime时间加减:
#将字符串转换为datetime时间
from datetime import datetime, timedelta
v = datetime.strptime('2025-10-6','%Y-%m-%d')
##datetime时间加减 timedelta
v1 = v + timedelta(days=4)
print(v1)
三者转换关系:
异常处理: try中如果有异常 except中捕获异常不飘红继续执行下面代码
格式: try:
pass
except Exception as e:
pass
i.isdecimal()即使不是数字都能进行判断所以不会触发except
content不能进行strip,异常被except捕获执行print(‘失误”) 则不飘红