一、内置模块
1.hashlib
import hashlib
def get_md5(str_to_code):
obj = hashlib.md5()
obj.update(str_to_code.encode("utf-8")) #明文
res = obj.hexdigest()
return res
val = get_md5('123')
print(val)
2.random
3.getpass
import getpass
pwd = getpass.getpass('请输入密码:')
if pwd == '123':
print('success')
4.time/datetime【时间相关】
4.1 datetime
# ======================获取datatime 格式的时间================
from datetime import datetime
#获取当前本地时间,并将其转化成字符串格式的时间
ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
#当前utc时间/伦敦时间
utctime = datetime.utcnow()
print(ctime,type(ctime))
#东2区的时间
tz = timezone(timedelta(hours=2))
v3 = datetime.now(tz)
print(v3)
'''
2021-02-14-11-30-29 <class 'str'>
2021-02-14 03:30:29.510515 <class 'datetime.datetime'>
2021-02-14 05:30:29.510515+02:00
'''
# ======================字符串转换成datatime================
v1 = datetime.strptime('2011-3-12','%Y-%m-%d')
print(v1,type(v1))
# ======================datatime加/减40天12小时================
v2 = v1+timedelta(days=40,hours=12)
print(v2)
v3 = v2.strftime('%Y-%m-%d')
print(v3)
# ======================datatime与时间戳time之间的关系================
import time
from datetime import datetime
ctime = time.time()
print(ctime)
v1 = datetime.fromtimestamp(ctime)
print(v1)
v2 = datetime.now()
val = v1.timestamp()
print(val)
'''
1613274068.5548413
2021-02-14 11:41:08.554841
1613274148.203175
'''
- 练习题
1. 压缩jd文件夹 zip
2. 将zip放到code目录(code默认不存在)
3. 将文件加压到指定目录中
import os
import shutil
if not os.path.exists('code'):
os.makedirs('code')
shutil.make_archive(os.path.join('code',ctime),'zip',r'C:\Users\10500\Desktop\AI_Learning\1_python_learning\02_函数\01_函数\lib')
file_path = os.path.join('code',ctime)+'.zip'
path = r'C:\Users\10500\Desktop\AI_Learning\1_python_learning\02_函数'
shutil.unpack_archive(file_path,path,'zip')
4.2 time
UTC/GMT: 世界时间
本地时间:本时区的时间
1. time.time() 时间戳,1970年1月1日0点0分开始经历的秒数(伦敦) ;1970年1月1日8点0分开始经历的秒数(中国) 155.../166....对这个敏感点
2. time.sleep(10) :等待的秒数
3. time.timezone() 电脑设置与伦敦时间差距的秒数
5. sys:python解释器相关
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin 输入相关
sys.stdout 输出相关
sys.stderror 错误相关
- sys.getrefcount(a) a变量的使用次数
a= [11,22,33]
b = a
print( sys.getrefcount(a))
- sys.getrecursionlimit() :python解释器支持的递归数量
v1 = sys.getrecursionlimit()
print(v1)
- sys.stdout.write(‘你好’) :类似于print,但是默认不加换行符->print 进度条
sys.stdout.write('你好')
sys.stdout.write('啊')
复制文件进度条
import os
#1. 读取文件大小(字节)
file_size = os.stat('CT.mp4').st_size
#2. 一点一点的读取文件
read_size = 0
with open('CT.mp4',mode='rb') as f,open('a.mp4',mode='wb') as f2:
while read_size<file_size:
chunk = f.read(1024)
f2.write(chunk)
read_size +=len(chunk)
val = int(read_size/file_size)*100
print('{}%\r'.format(val),end='')
-
sys.argv()【重要】
-
sys.path()【重要】
python导入模块,默认在sys.path中的路径挨个进行寻找,如果想要增加,可以通过sys.path.append
当如果想要导入其他路径之时,可以通过以下操作即可。
import sys
sys.path.append(r'path')
6. os [路径相关]
- os.stat(’'CT.mp4).st_size 获取文件大小```
- os.path.exists(path) 如果path存在,返回True,否则,返回False
- ps.path.abspath() 获取绝对路径
- os.path.dirname(v1) 获取上级目录
- os.path.join(v2,‘07_模块.py’,‘xxxxx’) 路径拼接
- os.listdir(r’C:\Users\10500\Desktop\AI_Learning\1_python_learning\01_python_basic’) 查看一个目录下第一层所有的文件【第一层】
- os.walk(r’C:\Users\10500\Desktop\AI_Learning\1_python_learning\01_python_basic’) 查看一个目录下所有层所有的文件【所有层】
- os.mkdir 创建一级目录
- os.makedirs 创建多级目录
- os.rename 重命名
import os
v1 = os.path.abspath('07_模块.py') #获取文件的绝对路径
print(v1)
v2 = os.path.dirname(v1) #获取上级目录
print(v2)
v3 = os.path.join(v2,'07_模块.py','xxxxx') #路径拼接
print(v3)
# 查看一个目录下所有的文件
v4 = os.listdir(r'C:\Users\10500\Desktop\AI_Learning\1_python_learning\01_python_basic')
print(v4)
v5 = os.walk(r'C:\Users\10500\Desktop\AI_Learning\1_python_learning\01_python_basic')
for a,b,c in v5 :
print(a,b,c)
# a. 正在查看的目录
# b.此目录下的文件夹
# C.此目录下的文件
import os
file_path = r'db\user.txt'
file_path2 = r'db1\db2\user.txt'
os.mkdir('db')
with open(file_path,mode='w',encoding='utf-8') as f:
f.write('sdsdg')
os.makedirs('db1\db2\db3')
with open(file_path2,mode='w',encoding='utf-8') as f:
f.write('sdsdg')
当已经创建完目录之后,再运行程序就会报错,为了防止此类情况,可写下如下代码
file_path2 = r'db1\db2\db3\user.txt'
file_folder= os.path.dirname(file_path2)
if not os.path.exists(file_folder):
os.makedirs(file_folder)
with open(file_path2,mode='w',encoding='utf-8') as f:
f.write('sdsdg')
7. shutil
1. 删除路径 shutil.rmtree(path)
2. 中命名
3. 压缩文件
4. 解压文件
import shutil
# 删除目录(只能是文件夹)
shutil.rmtree(path)
#重命名(文件夹或者文件)
shutil.move('x.txt','xx.txt')
#压缩文件
shutil.make_archive('name','zip',r'C:\Users\10500\Desktop\AI_Learning\1_python_learning\02_函数\01_函数\lib')
#解压文件
shutil.unpack_archive('name.zip',extract_dir='path',format='zip')
8. json
json是一个特殊的字符串,【长得像列表/字典/字符串/数字/真假等】
序列化,将列表/字典/字符串/数字/真假转换成json。反之则称为反序列化。
8.1 json的数据类型要求
- 内部数据只能是【int/str/list/dict/bool】
- 最外层必须是容器类型【dict/list】
- 在json中如果包含字符串,字符串里边的格式必须是双引号。
- json格式中不存在元组和集合
dumps,loads常见的数据类型
import json
v= [12,3,4,{'j':'k'},True,'asf']
#1. 将数据序列化,将python的值转换成json格式的字符串
v1 = json.dumps(v)
print(v1)
v2 = '["alex",123]'
print(type(v2))
#将数据反序列化,将json格式的字符串转换成python的数据类型
v3 = json.loads(v2)
print(type(v3))
'''
[12, 3, 4, {"j": "k"}, true, "asf"]
<class 'str'>
<class 'list'>
'''
- 面试题:常用的内置模块 (类库):json/time /os/sys
- 模块可以是一个Py文件,也可以是一个文件夹。
8.2 json序列化
-
- 字典或列表中如果有中文,序列化时想要保留中文显示,则通过以下操作
- 字典或列表中如果有中文,序列化时想要保留中文显示,则通过以下操作
import json
v1 = {'k1':'v2',"k2":"李连杰"}
res = json.dumps(v1,ensure_ascii=False)
print(res)
'''
{"k1": "v2", "k2": "李连杰"}
'''
使用**dump()**函数,将内容写入文件中
import json
v1 = {'k1':'v2',"k2":"李连杰"}
with open('x.txt',mode='w',encoding='utf-8') as f:
res = json.dump(v1 , f,ensure_ascii=False)
print(res)
使用load()函数,将文件中的内容读出,并进行反序列化
with open('x.txt',mode='r',encoding='utf-8') as f:
res = json.load(f)
print(res)
print(type(res))
'''
{'k1': 'v2', 'k2': '李连杰'}
<class 'dict'>
'''
9. pickle
- json:优点:所有语言通用,缺点:只能序列化基本的数据类型:list/dict/int
- pickle:优点:python中所有东西(包括函数)都能被序列化(socket对象),缺点:序列化的内容只能有python认识
- dumps之后,json得到的是字符串,pickle得到的是字节
import pickle
v1 = {1,2,3}
#序列化
v = pickle.dumps(v1)
print(v)
#反序列化
data = pickle.loads(v)
print(data)
'''
b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03e\x85q\x02Rq\x03.'
{1, 2, 3}
'''
with open('x.txt',mode='wb') as f:
res = pickle.dump(v1 , f)
print(res)
with open('x.txt',mode='rb') as f:
res = pickle.load(f)
print(res)
二、第三方模块
终端中(cmd)
pip install xxx
安装过程中的问题
- 网络慢
- pip需要重新安装
python -m pip install --upgrade pip
- 安装完成后,导入不成功,则重启pycharm,否则就是安装错了
三、自定义模块
当字定义模块的时候,如果定义一个文件夹,py2一定要定义一个__init.py__
,py3可以不需要,但是一般的包都有这个文件。
1. 模块调用
# folder_test文件夹下的user
def func1():
print(123)
def func2():
print(345)
print('qwer')
# 导入此模块,加载次模块中的所有值到内存
import folder_test.user as fu
fu.func1()
print('===============')
fu.func2()
from folder_test.user import func1,func2
func1()
#导入所有模块
from folder_test.user import *
在导入模块的时候注意该模块可能与调用文件里边的函数重名,这个时候一般在导入模块的时候,将该模块重命名
小结:
- 模块和要执行的py文件在同一目录,且需要模块中的很多功能的时候,推荐使用import模块
- 其他推荐使用 from 模块 import 模块,通过模块.函数()调用
2.包的调用
由于函数可以调用该函数所在目录下的其他模块,所以这里虽然标红,但是仍然可以正常运行
此处导入x模块,没有报错,是因为pycharm默认导入此模块所在的根目录。
如果改变根目录,则会报错
import client
import sys
import os
path = os.path.dirname(os.path.abspath(__file__))
path = os.path.dirname(path)
sys.path.append(path)
import x
client.c_fun1()
x.x_func()
如果想要导入lib文件夹的jd.py函数,则做以下操作
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import lib.jd as jd
jd.shopping()
写项目的文件夹一般为两类
- 若可执行的脚本有多个,则建立如左端的那种结构
- 若可执行的脚本只有一个,则建立如右端的那种结构
4.异常处理
可以放在任何地方
try :
val = input('请输入数字')
num = int(val)
print(num)
except Exception as e:
print('操作异常')
def func(a):
try :
print(a.strip())
return a.strip()
except Exception as e :
print('异常')
return False
func([123,34])
func(' ee ee')
练习题:
import requests
def func(url_list):
res = []
for url in url_list:
try :
response = requests.get(url)
res.append(response)
except Exception as e:
pass
return res
func(['http://www.baidu.com','http://www.google.com'])