1. 今日内容
模块基础知识
- time/datetime
- JSON/picle
- shutil
- logging
其他
2. 内容回顾和补充
2.1 模块(类库)
内置
第三方
自定义
面试题:
列举常用内置模块: JSON / time / os/ sys
2.2 定义模块
定义模块时可以把一个 py 文件或一个文件夹 (包) 当作一个模块, 以方便于以后其他 py 文件的调用 .
对于包 (文件夹) 的定义:
py2: 文件见中必须有 _ init _.py . 手工创建此文件即可.
在 pycharm 中手工创建 python package 时候, 默认自动会在这个文件中创建 --init--.py 文件.
py3: 不需要 _ init _.py .
推荐大家以后写代码时, 都要加上此文件.
2.3 模块的调用
2.3.1 示例一
- # lizhongwei.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- def show():
- print('我司里种种')
- def func():
- pass
- print(456)
- # 导入模块, 加载此模块中所有的值到内存. 所以此时先打印出: 456. 后打印该代码块下面的 123.
- import lizhongwei
- print(123)
- # 调用模块中的函数
- lizhongwei.func()
- # 导入模块
- from lizhongwei import func,show
- from lizhongwei import func
- from lizhongwei import show
- from lizhongwei import *
- func()#from 导入方法, 直接使用函数.
- # 导入模块
- from lizhongwei import func as f# 别名法, 防止 func 函数与现有代码中函数重名.
- def func():
- print(123)
- f()
导入模块:
import 模块 使用方式: 模块. 函数()
from 模块 import 函数 使用方式: 函数()
from 模块 import 函数 as 别名 使用方式: 别名()
2.3.2 示例二
- lizhong
- - jd.py
- - pdd.py
- - tb.py
包. py
- # 上个代码框中的文件夹中文件, 引用如下方法:
- import lizhong.jd
- lizhong.jd.f1()
- from lizhong import jd
- jd.f1()
- from lizhong.jd import f1
- f1()
总结
模块和要执行的 py 文件在同一目录 且 需要 模块中的很多功能时, 推荐用: import 模块
其他推荐: from 模块 import 模块 用法: 模块. 函数()
其他推荐: from 模块. 模块 import 函数 用法: 函数()
注意: sys.path 的作用是什么? sys.path 默认在 py 的安装目录和执行文件当前所在的目录.
1, 如果要增加非 py 安装目录下, 需要 append 非 py 安装目录. sys.path.append('path').
然后在引用目录下的 py 文件就可以引用成功: 如: import page
2, 如果 page 的上级目录和执行的文件在同一个目录(lib), 这样引用也可以:
from lib import page
3, 如果 page 和执行的 py 文件在同一个目录下, 直接引用即可.
import page
练习题
将父级目录加入 sys.path 中, 方便后期调用此父级下的代码块.
- import sys
- v=sys.path
- print(v)
- import os
- print(__file__)
- print(os.path.dirname(__file__))
- print(os.path.abspath(__file__))
- print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.append(DIR)
- print(sys.path)
- ===
- ['C:\\python\\venv', 'C:\\python', 'C:\\python\\python36\\python36.zip', 'C:\\python\\python36\\DLLs', 'C:\\python\\python36\\lib', 'C:\\python\\python36', 'C:\\python\\python36\\lib\\site-packages', 'C:\\python\\PyCharm 2019.2.2\\PyCharm 2018.2.1\\helpers\\pycharm_matplotlib_backend']
- C:/python/venv/day15.py
- C:/python/venv
C:\python\venv\day15.py
- C:\python
- ['C:\\python\\venv', 'C:\\python', 'C:\\python\\python36\\python36.zip', 'C:\\python\\python36\\DLLs', 'C:\\python\\python36\\lib', 'C:\\python\\python36', 'C:\\python\\python36\\lib\\site-packages', 'C:\\python\\PyCharm 2019.2.2\\PyCharm 2018.2.1\\helpers\\pycharm_matplotlib_backend', 'C:\\python']
2.4 内置模块
- os
- sys
- time
- JSON
- dumps
- dump(v,f)# 将 v 写入文件 f 中.
- loads
print(load(f)), 打印文件中内容.
注意:
字典或列表中如有中文, 序列化时想要保留中文显示:
- v = {
- 'k1':'alex','k2':'李杰'
- }
- import JSON
- val = JSON.dumps(v,ensure_ascii=False)# 保留中文
- print(val)
- dump
- import JSON
- v = {
- 'k1':'alex','k2':'李杰'
- }
- f = open('x.txt',mode='w',encoding='utf-8')
- val = JSON.dump(v,f)
- print(val)
- f.close()
- load
- import JSON
- v = {
- 'k1':'alex','k2':'李杰'
- }
- f = open('x.txt',mode='r',encoding='utf-8')
- data = JSON.load(f)
- f.close()
- print(data,type(data))
- haslib
- random
- getpass
- shutil
- copy
3. 今日内容
3.1 JSON 和 pickle
JSON, 优点: 所有语言通用; 缺点: 只能序列化基本的数据类型 list/dict/int...
pickle, 优点: python 中所有的东西都能被他序列化(socket 对象); 缺点: 序列化的内容只有 python 认识.
- import pickle
- # #################### dumps/loads ######################
- """
- v = {1,2,3,4}
- val = pickle.dumps(v)# 序列化出来不可读
- print(val)
- data = pickle.loads(val)
- print(data,type(data))
- """"""
- # 序列化函数(json 做不到):
- def f1():
- print('f1')
- v1 = pickle.dumps(f1)
- print(v1)
- v2 = pickle.loads(v1)
- v2()
- """
- # #################### dump/load ######################
- # v = {1,2,3,4}
- # f = open('x.txt',mode='wb')
- # val = pickle.dump(v,f)
- # f.close()
- # f = open('x.txt',mode='rb')
- # data = pickle.load(f)
- # f.close()
- # print(data)
- ==================
encording 后称作字节
JSON: 得出来的是字符串
pickle: 得出来的是字符串
3.2 shutil 模块
- import shutil
- # 删除目录
- # shutil.rmtree('test')
- # 重命名, 文件和目录都可以
- # shutil.move('test','ttt')
- # 压缩文件
- # shutil.make_archive('zzh','zip','D:\code\s21day16\lizhong')
- # 解压文件, 有目录直接解压, 无目录, 则直接创建
- # shutil.unpack_archive('zzh.zip',extract_dir=r'D:\code\xxxxxx\xxxx',format='zip')
示例
- import os
- import shutil
- from datetime import datetime
- ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
- # 1. 压缩 lizhongwei 文件夹 zip
- # 2. 放到到 code 目录(默认不存在)
- # 3. 将文件解压到 D:\x1 目录中.
- if not os.path.exists('code'):
- os.makedirs('code')
- shutil.make_archive(os.path.join('code',ctime),'zip','D:\code\s21day16\lizhongwei')
- file_path = os.path.join('code',ctime) + '.zip'
- shutil.unpack_archive(file_path,r'D:\x1','zip')
- 3.3 time&datetime
UTC/GMT: 世界时间
本地时间: 本地时区的时间.
3.3.1 time 模块
time.time() , 时间戳: 1970-1-1 00:00
time.sleep(10), 等待秒数.
- time.timezone
- # https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZwIFHM6iw==&tip=1&r=-781028520&_=1555559189206
3.3.2 datetime 模块
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import time
- from datetime import datetime,timezone,timedelta
- # ######################## 获取 datetime 格式时间 ##############################
- """
- v1 = datetime.now() # 当前本地时间
- print(v1)
- tz = timezone(timedelta(hours=7)) # 当前东 7 区时间
- v2 = datetime.now(tz)
- print(v2)
- v3 = datetime.utcnow() # 当前 UTC 时间
- print(v3)
- """print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
- # ######################## 把 datetime 格式转换成字符串 ##############################
- # v1 = datetime.now()
- # print(v1,type(v1))
- # val = v1.strftime("%Y-%m-%d %H:%M:%S")
- # print(val)
- # ######################## 字符串转成 datetime ##############################
- # v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
- # print(v1,type(v1))
- # ######################## datetime 时间的加减 ##############################
- # v1 = datetime.strptime('2011-11-11','%Y-%m-%d')
- # v2 = v1 - timedelta(days=140)
- # date = v2.strftime('%Y-%m-%d')
- # print(date)
- # ######################## 时间戳和 datetime 关系 ##############################
- # ctime = time.time()
- # print(ctime)
- # v1 = datetime.fromtimestamp(ctime)
- # print(v1)
- # v1 = datetime.now()
- # val = v1.timestamp()
- # print(val)
3.4 异常处理
- try:
- val = input('请输入数字:')
- num = int(val)
- except Exception as e:
- print('操作异常')
- # import requests
- #
- # try:
- # ret = requests.get('http://www.google.com')
- # print(ret.text)
- # except Exception as e:
- # print('请求异常')
- def func(a):
- try:
- return a.strip()
- except Exception as e:
- pass
- return False
- v = func('alex')
- if not v:
- print('函数执行失败')
- else:
- print('结果是',v)
练习题
- # 1. 写函数, 函数接受一个列表, 请将列表中的元素每个都 +100
- def func(arg):
- result = []
- for item in arg:
- if item.isdecimal():
- result.append(int(item) + 100)
- return result
- # 2. 写函数去, 接受一个列表. 列表中都是 url, 请访问每个地址并获取结果.
- import requests
- def func(url_list):
- result = []
- try:
- for url in url_list:
- response = requests.get(url)
- result.append(response.text)
- except Exception as e:
- pass
- return result
- def func2(url_list):
- result = []
- for url in url_list:
- try:
- response = requests.get(url)
- result.append(response.text)
- except Exception as e:
- pass
- return result
- func(['http://www.baidu.com','http://www.google.com','http://www.bing.com'])
异常处理结构:
- try:
- pass
- except Exception as e:
- pass
来源: https://www.cnblogs.com/cuiyongchao007/p/12297314.html