第一阶段:Python开发基础 day17 模块的使用(二)

上节课内容回顾

模块的四种形式

  1. 自定义模块
  2. 第三方库
  3. 内置模块

import和from...import

import

  1. 生成一个名字为time的名称空间
  2. 运行time.py文件,然后把生成的变量丢入 time的名称空间内
  3. run文件指向 time这个名称空间, time.方法名()

from...import

  1. 生成一个名字为time的名称空间
  2. 运行time.py文件,然后把生成的变量丢入 time的名称空间内
  3. run文件指向 import后面的一个(多个)方法名, 所以直接 方法名()

循环导入问题

m4.py
from m2 import y
x = 10
# m2.py

from m1 import x
y = 20

```
  1. 执行m1.py
  2. m1.py运行到from m2 import y,要运行m2.py
  3. m2.py运行到from m1 import x,要运行m1.py
  4. 进入死循环

解决方案

m2.py
def f1():
    from m2 import y
x = 10

#### m2.py

def f1():
    from m1 import x
    
y = 20

模块的搜索路径

内存 --> 内置 --> 自定制 --> 环境变量(sys.path)

Pthon文件的两种用途

  1. 执行文件: 当前运行的文件
  2. 模块文件: 被当做模块导入的文件

if __name__ == '__main__'

在执行文件中运行__name__ == '__main__', 在被当做模块导入的时候__name__ == 模块文件名

random模块

随机数

一、包

包:包其实是一个文件夹(必须得含有_ init _.py这个文件)

init让普通的文件夹成为一个包, 导包就是导init

  1. 运行init这个文件
  2. 创建 一个init名称空间
  3. 然后把inti内的变量丢入 init 这个名称空间内

导包就是导入init
包的文件以执行文件的环境变量为基准,包的init只能从包名开始导入
相对导入: (只能在包中使用)
.是当前目录
..是父目录

二、time模块

# time模块:支持三种不同形式的时间,不同形式的时间之间可以转换
import time

# 时间戳
print(time.time())  # 1565922341.6068554

# 格式化时间
#                    year month day X
print(time.strftime('%Y_%m_%d %X'))  # 2019_08_16 10:26:36

# 结构化时间
print(time.localtime())  # 当地时间(中国)
print(time.gmtime())  # 标准时间

# 三种格式时间的转换(没必要记)

# 结构化时间转格式化时间
print(time.strftime('%Y-%m-%d %X', time.localtime()))
# 格式化时间转结构化时间
print(time.strptime('2019-08-16 10:30:44', '%Y-%m-%d %X'))

# 结构化时间转时间戳
print(time.mktime(time.localtime()))
# 时间戳转结构化时间
print(time.localtime(time.time()))


# 重点
time.time()
time.sleep(2)

三、datetime模块

# datetime模块:时间的修改
import datetime

print(datetime.datetime.now())  # 打印时间

now = datetime.datetime.now()

print(now+datetime.timedelta(3))  # 默认+3天

print(now+datetime.timedelta(hours=3))  # 3小时
print(now+datetime.timedelta(minutes=3))  # 3分钟

print(now.replace(year=1900))

四、os模块

# os模块:与操作系统交互,可以操控文件
import os

# 获取当前文件目录
print(os.getcwd())

# 创建文件夹
os.mkdir('m2')
# 删除文件夹
os.rmdir('m2')

# 当前目录所有文件(经常用)
res = os.listdir(r'path')

# 改名字
os.rename('test.py', 'test1.py')
# 移除
os.remove('test1.py')

# __file__(当前文件路径)只有pycharm猜提供,python本身不支持
print('os.path.abspath(__file__)') # 支持不同的平台(windows,ios,andirod,linux)

# 文件不存在False,存在True
print(os.path.exists('test.py'))

# 是否为文件
print(os.path.isfile('test.py'))
# 是否为文件夹
print(os.path.isdir('test.py'))

# 拼接路径(经常使用)
res = os.path.join(r'D:\上海Python11期视频\python11期视频\day 17\m1\bbb','m5.py')

# 返回文件的上一级目录(经常使用)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# 返回三个值,第一个值是路径;第二个值是路径下的文件夹,第三个值是路径下的文件
g = os.walk(r'D:\path')
for i in g:
    print(i)

五、sys模块

#sys模块: 与Python解释器交互
import  sys

# print(sys.path)

print(sys.argv)  # 接收参数(用cmd执行文件时运行才有效)

print(sys.modules)

六、json模块

  • 用python写了一个程序,用java写了一门程序,这两个程序需要数据之间交流,规定了一种多种语言通用的数据类型,json串

  • 序列化:从python的字典(最常用)变成json串, dump

  • 反序列化:从json串变成python的字典(最常用),load

用法:

import json

dic = {'a': 1, 'b': 'abc', 'c': None}
data = json.dumps(dic)  # 序列化到内存中
print(data,type(data))  # 单引号全部变成双引号
data = json.loads(data)  # 从内存中获取json串
print(data,type(data))

with open('test.json','w',encoding='utf8') as fw:
    json.dump(dic,fw)

with open(f'{"test"}.json','r',encoding='utf8') as fr:
    data = json.load(fr)
    print(data)

七、pickle模块

  1. 在Python中可以存任意对象,但是必须得以二进制存储
  2. 可以序列化python中所有对象(数据类型),但是无法跨平台

使用示例:

dic = {'a': 1, 'b': 'abc', 'c': None}
def func():
    x = 3
    print(x)

import pickle
with open('test.pkl','wb') as fw:
    pickle.dump(func,fw)

with open('test.pkl', 'rb') as fr:
    data = pickle.load(fr)
    data()
    print(data)

八、hashlib模块

密码加密:无论你丢什么字符串,他都会返回一串 固定长度的字符串

使用示例:

import hashlib

m = hashlib.md5()  # 固定的写法
m.update(b'123456')
# m.update(b'456')
print(m.hexdigest())

# 123 456 --》 e10adc3949ba59abbe56e057f20f883e
# 123456 --》 e10adc3949ba59abbe56e057f20f883e

# 1. 变成固定的字符串
# 1. 相同的字符串哈希后结果一样
# 2. 叠加性

九、hmac模块

对密码加密,可以加盐

使用示例:

import hmac

m = hmac.new(b'abc')  # 加盐
m.update(b'123456')
# m.update(b'456')
print(m.hexdigest())

# abc 123 456 --> 8c7498982f41b93eb0ce8216b48ba21d
# abc 123456 --> 8c7498982f41b93eb0ce8216b48ba21d
# a 1234556 --》 3e391a1d7bf574cec59679244a2904fe


# 123456 --> 8c7498982f41b93eb0ce8216b48ba21d
# 123456 --> 8c7498982f41b93eb0ce8216b48ba21d

十、logging模块

日志,用的时候去老师博客ctrl + c

import logging

# v1
# logging.debug('调试')  # 10
# logging.info('正常')   # 20  # 用这一个
# logging.critical('严重错误') # 30
# logging.error('错误') # 40
# logging.warning('警告') # 50
# 默认30以上的可以输出

# v2 日志信息记录在文件当中


# logging.basicConfig(filename='access.log',
#                     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
#                     datefmt='%Y-%m-%d %H:%M:%S %p',
#                     level=10)

# logging.debug('调试信息')  # 10
# logging.info('正常信息')  # 20
# logging.warning('警告信息')  # 30
# logging.error('报错信息')  # 40
# logging.critical('严重错误信息')  # 50

# v3

# 1. 生成一个logger对象
logger = logging.getLogger('nick')

# 2. 生成格式
formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                               datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater2 = logging.Formatter('%(asctime)s :  %(message)s',
                               datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater3 = logging.Formatter('%(name)s %(message)s',)

# 3. 生成一个文件对象
h1 = logging.FileHandler('h1.log')
h2 = logging.FileHandler('h2.log')
sm = logging.StreamHandler()

# 4. 文件绑定格式
h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
sm.setFormatter(formmater3)

# 5. 绑定文件
logger.addHandler(h1)
logger.addHandler(h2)
logger.addHandler(sm)

# 6. 控制级别
logger.level = 50

# 7. 使用
logger.debug('调试信息')  # 10
logger.info('正常信息')  # 20
logger.warning('警告信息')  # 30
logger.error('报错信息')  # 40
logger.critical('严重错误信息')  # 50

今日总结

posted @ 2019-08-16 19:32  foreversun92  阅读(214)  评论(0编辑  收藏  举报