玩蛇(Python)笔记之基础Part5
玩蛇(Python)笔记之基础Part5
标签:Python
一.Python模块
-
python模块 其实就是其他语言的类库 先导入后使用
-
分为内置模块 自定义模块 第三方模块 用于代码分类
-
模块名字很重要 导入模块的依据 sys.path
-
导入的方式 import 和 from ... import ... as ...
-
单模块 import 嵌套在文件夹中的 from import as
-
第三方模块安装 pip3安装 源码安装
-
源码安装 先下载源代码 按照文档安装 一般是解压然后进入目录 运行python3 setup.py install
-
模块中的特殊变量 查看模块中的变量
print(vars(sys)) # __doc__获取文件的注释 就是在文件的开头 用三引号框起来的内容 # __cached__模块的字节码所在路径 # __file__ 获得模块所在路径 可能会得到一个相对路径 os.path.abspath(__file__) # 获取绝对路径 os.path.dirname(__file__) # 找上级目录 # __package__ 当前文件在哪个包里 # __name__ 执行哪个文件 哪个文件的 __name__==“__main__”
-
sys和os模块
import sys import os import time # sys模块 跟解释器相关的都在sys里 和系统相关的都在os里 print(sys.argv[0]) # 命令行参数list 第一个元素是程序本身路径 # sys.exit(0) # 退出程序 正常退出时sys.exit(0) print(sys.version) # python解释器版本 print(sys.maxsize) # 最大int值 print(sys.path) # 模块搜索路径 初始化时使用PYTHONPATH环境变量的值 print(sys.platform) # 操作系统平台 # sys.stdin # 标准输入相关 # sys.stdout # 标准输出相关 # sys.stderr # 标准错误相关 # 进度条 def view_bar(num, total): rate = num / total rate_num = int(rate * 100) r = '\r%d%%' % (rate_num,) # \r表示回到当前行的收个首个位置 r1 = '\r%s>%d%%' % ("=" * num, rate_num) # print(r) sys.stdout.write(r) # 不自带换行符 sys.stdout.flush() for i in range(0, 101): time.sleep(0.1) view_bar(1, 100) # os模块 目录文件操作等等 看文档去吧 os.path.abspath('') # 返回path的规范化绝对路径 os.path.dirname('') # 返回path的目录 os.path.join('', '') # 多个路径拼接 第一个绝对路径之前的参数将被忽略
-
加密模块
```python
# 加密模块 md5加密
import hashlib
obj = hashlib.md5()
obj.update(bytes('123', encoding='utf-8'))
result = obj.hexdigest()
print(result)
# 为了防止撞库 可以加一个自己的key
obj = hashlib.md5(bytes('asdfasdfasdf', encoding='utf-8'))
obj.update(bytes('123', encoding='utf-8'))
result = obj.hexdigest()
print(result)
```
二.序列化和反序列化
-
序列化和反序列化 jason 和 pickle
import json import requests import pickle
-
将python的基本数据类型转换成字符串类型 反过来同理
dic = {'haha': 'asdf', 'age': 12} print(dic, type(dic)) result = json.dumps(dic) print(result, type(result)) s1 = '{"k1":123}' print(type(json.loads(s1))) response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=广州') response.encoding = 'utf-8' dic = json.loads(response) print(type(dic))
-
注意 单引号和双引号的问题 由于python语言特殊单双引号一样 但别的语言不是 所以在内容中一定要用双引号
li = '["year":123,"age":123]' ret = json.loads(li)
-
dump和load操作 写入文件 从文件读
json.dump(li, open('db', 'w')) li = json.load(open('db', 'r'))
-
pickle 只能python用的序列化
import pickle li = [11, 22, 33] r = pickle.dumps(li) print(r) result = pickle.loads(r) print(result) pickle.dump(li, open('db', 'wb')) li = pickle.load(open('db', 'rb'))
-
注意jason只能处理基本数据类型,,pickle都可以 但是pickle只能python之间用 jason 更加适合跨语言 pickle适用于复杂类型
三.时间模块
-
time模块
import time
-
时间戳 从1970年一月一日到现在的秒数
print(time.time())
-
当前时间 字符串格式 可以给时间戳参数将时间戳转换成字符串格式
print(time.ctime()) print(time.ctime(time.time() - 86400))
-
将时间的每一个值分开并取出 返回时间对象 和ctime一样可以转换时间戳
time_obj = time.gmtime() print(time_obj) print(time_obj.tm_year, time_obj.tm_mon)
-
注意当前时间是格林威治时间 获取本地时间
print(time.localtime())
-
将structtime转换成时间戳
print(time.mktime(time.gmtime()))
-
延时 用来做阻塞
time.sleep(4) print("---")
-
将时间对象转换成你想要的时间格式 将字符串按照给定格式转换成时间对象
print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())) print(time.strptime("2016-01-28", "%Y-%m-%d"))
-
datetime模块
import datetime
-
输出当前时期 将时间戳转换成日期格式 当前准确时期时间 返回时间对象
```python
# 输出当前时期
print(datetime.date.today())
# 将时间戳转换成日期格式
print(datetime.date.fromtimestamp(time.time()))
# 当前准确时期时间
print(datetime.datetime.now())
# 返回时间对象
print(datetime.datetime.now().timetuple())
```
- 时间的加减
```python
print(datetime.datetime.now() + datetime.timedelta(days=10))
print(datetime.datetime.now() + datetime.timedelta(days=-10))
print(datetime.datetime.now() - datetime.timedelta(days=10))
print(datetime.datetime.now() + datetime.timedelta(hours=10))
```
- 字符串时间替换 将字符串按照给定格式转换成时间对象 时间对象之间可以相互比较
```python
print(datetime.datetime.now().replace(2014, 9, 26))
# 将字符串按照给定格式转换成时间对象
print(datetime.datetime.strptime("2016-01-28", "%Y-%m-%d"))
# 时间对象之间可以相互比较
```
四.Logging模块
-
日志级别 DEBUG INFO WARING ERROR CRITICAL
logging.warning('user [year] attemped wrong password more than 3 times') logging.critical('server is down')
-
将日志写入文件 指定级别 只有比此级别高的才能写入文件 还可以指定具体格式和时间格式
logging.basicConfig(filename='example.log', level=logging.INFO, format='$(asctime)s%(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.DEBUG('asdfs') logging.warning('123123') logging.critical('asdfdf')
-
同时将log打印到屏幕和写入文件里 logging的几大部分 logger handlers filters formatters
# 创建logger logger = logging.getLogger('TEST-LOG') # 先获取logger对象 logger.setLevel(logging.DEBUG) # 设置全局的日志级别 # 创建屏幕handlers ch = logging.StreamHandler() # 获取屏幕handler ch.setLevel(logging.DEBUG) # 设计屏幕日志级别 # 创建文件handlers fh = logging.FileHandler('access.log') # 同上 fh.setLevel(logging.WARNING) # 创建foramtter并且将formatter添加到ch和fh formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) # 告诉logger将log输出到哪 logger.addHandler(ch) logger.addHandler(fh)
-
注意 局部级别只能比全局高不能比全局低
五.反射
-
利用字符串形式 去(模块)对象中操作(寻找/检查/删除/设置)成员, 这就叫反射 django这种框架就会用到
-
hasattr(模块名,成员名) 判断模块中是否有该成员
-
getattr(模块名,成员名) 取得模块中的成员
-
setattr(模块名,) 设置模块中的成员 在内存中操作
-
delattr() 删除模块中的成员 在内存中操作
-
利用反射动态的导入模块
obj=__import__("time") obj=__import__("lib.cccc",fromlist=True)