玩蛇(Python)笔记之基础Part5

玩蛇(Python)笔记之基础Part5

标签:Python


一.Python模块

  1. python模块 其实就是其他语言的类库 先导入后使用

  2. 分为内置模块 自定义模块 第三方模块 用于代码分类

  3. 模块名字很重要 导入模块的依据 sys.path

  4. 导入的方式 import 和 from ... import ... as ...

  5. 单模块 import 嵌套在文件夹中的 from import as

  6. 第三方模块安装 pip3安装 源码安装

  7. 源码安装 先下载源代码 按照文档安装 一般是解压然后进入目录 运行python3 setup.py install

  8. 模块中的特殊变量 查看模块中的变量

    print(vars(sys))
    # __doc__获取文件的注释 就是在文件的开头 用三引号框起来的内容
    # __cached__模块的字节码所在路径
    # __file__ 获得模块所在路径 可能会得到一个相对路径
    os.path.abspath(__file__)  # 获取绝对路径
    os.path.dirname(__file__)  # 找上级目录
    # __package__ 当前文件在哪个包里
    # __name__ 执行哪个文件 哪个文件的 __name__==“__main__”
    
  9. 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('', '')  # 多个路径拼接 第一个绝对路径之前的参数将被忽略
    
  10. 加密模块

```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)
```

二.序列化和反序列化

  1. 序列化和反序列化 jason 和 pickle

    import json
    import requests
    import pickle
    
  2. 将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))
    
  3. 注意 单引号和双引号的问题 由于python语言特殊单双引号一样 但别的语言不是 所以在内容中一定要用双引号

    li = '["year":123,"age":123]'
    ret = json.loads(li)
    
  4. dump和load操作 写入文件 从文件读

    json.dump(li, open('db', 'w'))
    li = json.load(open('db', 'r'))
    
  5. 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'))
    
  6. 注意jason只能处理基本数据类型,,pickle都可以 但是pickle只能python之间用 jason 更加适合跨语言 pickle适用于复杂类型


三.时间模块

  1. time模块

    import time
    
  2. 时间戳 从1970年一月一日到现在的秒数

    print(time.time())
    
  3. 当前时间 字符串格式 可以给时间戳参数将时间戳转换成字符串格式

    print(time.ctime())
    print(time.ctime(time.time() - 86400))
    
  4. 将时间的每一个值分开并取出 返回时间对象 和ctime一样可以转换时间戳

    time_obj = time.gmtime()
    print(time_obj)
    print(time_obj.tm_year, time_obj.tm_mon)
    
  5. 注意当前时间是格林威治时间 获取本地时间

    print(time.localtime())
    
  6. 将structtime转换成时间戳

    print(time.mktime(time.gmtime()))
    
  7. 延时 用来做阻塞

    time.sleep(4)
    print("---")
    
  8. 将时间对象转换成你想要的时间格式 将字符串按照给定格式转换成时间对象

    print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))
    print(time.strptime("2016-01-28", "%Y-%m-%d"))
    
  9. datetime模块

    import datetime
    
  10. 输出当前时期 将时间戳转换成日期格式 当前准确时期时间 返回时间对象

```python
# 输出当前时期
print(datetime.date.today())
# 将时间戳转换成日期格式
print(datetime.date.fromtimestamp(time.time()))
# 当前准确时期时间
print(datetime.datetime.now())
# 返回时间对象
print(datetime.datetime.now().timetuple())
```
  1. 时间的加减
```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))
```
  1. 字符串时间替换 将字符串按照给定格式转换成时间对象 时间对象之间可以相互比较
```python
print(datetime.datetime.now().replace(2014, 9, 26))

# 将字符串按照给定格式转换成时间对象
print(datetime.datetime.strptime("2016-01-28", "%Y-%m-%d"))

# 时间对象之间可以相互比较
```

四.Logging模块

  1. 日志级别 DEBUG INFO WARING ERROR CRITICAL

    logging.warning('user [year] attemped wrong password more than 3 times')
    logging.critical('server is down')
    
  2. 将日志写入文件 指定级别 只有比此级别高的才能写入文件 还可以指定具体格式和时间格式

    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')
    
  3. 同时将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)
    
  4. 注意 局部级别只能比全局高不能比全局低


五.反射

  1. 利用字符串形式 去(模块)对象中操作(寻找/检查/删除/设置)成员, 这就叫反射 django这种框架就会用到

  2. hasattr(模块名,成员名) 判断模块中是否有该成员

  3. getattr(模块名,成员名) 取得模块中的成员

  4. setattr(模块名,) 设置模块中的成员 在内存中操作

  5. delattr() 删除模块中的成员 在内存中操作

  6. 利用反射动态的导入模块

    obj=__import__("time")
    obj=__import__("lib.cccc",fromlist=True)
    

posted @ 2016-11-27 20:08  YEAR~  阅读(340)  评论(0编辑  收藏  举报