No.16模块(三)

No.16

今日概要

  • 模块的基础知识
  • time / datetime
  • json / picle
  • shutil
  • logging

内容回顾和补充

1.模块分类(模块别名类库)

  • 内置
  • 第三方
  • 自定义

面试题:

  • 列举常用的内置模块:json / time ....... / os / sys

2.定义模块

定义模块可以把py文件或文件夹(包)当作一个模块,方便以后其它py文件的使用。

对于包的定义:

  • py2:文件夹中必须有 _ _ init_ _.py
  • py3:不需要

推荐大家以后写代码时,都要在文件夹中添加此文件。

3.模块调用

3.1示例一

#模块a.py
def func():
    print(666)
def show():
    print(888)

print(123)
#导入模块方式一
import a # 加载模块中所有的值到内存
print(456)
a.fun()
'''先打印123,再打印456。'''
#导入模块方式二
from a import func
func()
'''先打印123,再打印666。'''
此种方式导入只能用func函数,show函数则不能使用,不过模块中的所有值还是会全部被先加载到内存。

from a import func,show
from a import *  # 能使用模块中的所有函数
#导入模块方式三
from a import func as f  # 导入模块中的func函数并取别名。
def func():
    print(789)
f()

导入模块:

  • import 模块 模块.函数()
  • from 模块 import *
  • from 模块 import 函数 函数()
  • from 模块 import 函数 as 别名 别名()

3.2示例二

#方式一
import 包.a
包.a.func()
#方式二
from 包 import a
a.func()
#方式三
from 包.a import func
func()

3.3总结

  • import 导入单层 / from import 可以导入多层
  • 模块和执行的py文件在同一目录,需要模块中的很多功能:
    • 推荐用:import 模块
  • 其它情况:
    • form 模块 import 模块 模块.函数()
    • from 模块.模块 import 函数 函数()

注意:sys.path的作用是什么?

习题

3.4.内置模块

  • os

  • sys

  • time

  • json

    • dumps ▲

    • loads ▲

    • dump

      v = {'k1':'alex','k2':'中国'}
      import json
      f = open('x.txt',mode='w',encoding='utf-8')
      val = json.dump(v,f)
      print(val)
      f.close()
      #将数据序列化成json格式写入文件
      
    • load

      import json
      f = open('test.txt',mode='r',encoding='utf-8')
      val = json.load(f)
      print(val,type(val))
      f.close()
      #将文件中json格式数据反序列化读取出来
      
    • 注意:

      • 字典或列表中如有中文,序列化时想要保留中文显示。

  • haslib

  • random

  • getpass

  • shutil

  • copy

今日内容

1.json和pickle

  • json

    • 优点:所有语言通用
    • 缺点:只能序列化Python的基本数据类型 list/dict/int/str/bool
    # dump
    import json
    v = {'k1':11,'k2':22}
    f = open('x.txt',mode='w',encoding='utf-8')
    json.dump(v,f)
    f.close()
    # load
    f = open('x.txt',mode='r',encoding='utf-8')
    data = json.load(f)
    f.close()
    print(data)
    
  • pickle

    • 优点:Python中所有东西都能被它序列化(socket对象)
    • 缺点:序列化的内容只有Python认识
    #序列化/反序列化
    # dumps/loads
    import pickle
    v = {1,2,3}
    val = pickle.dumps(v)
    print(val)
    data = pickle.loads(val)
    print(data,type(data))
    
    import pickle
    def f1():
        print('f1')
    v1 = pickle.dumps(f1)
    print(v1)
    v2 = pickle.loads(v1)
    print(v2)
    v2()
    
    #序列化写入文件/反序列化读取文件
    # dump/load 
    import pickle
    v = {1,2,3,4}
    print(pickle.dumps(v))  # 已经是2进制
    f = open('test.txt',mode='wb')
    val = pickle.dump(v,f)
    f.close()
    
    import pickle
    f = open('test.txt',mode='rb')
    data = pickle.load(f)
    f.close()
    print(data)
    
    #Python数据通过json序列化后得到的是json格式的字符串
    #Python数据通过pickle序列化后得到的是pickle格式的字节流
    import pickle
    v1 = {1,2,3}
    val1 = pickle.dumps(v1)
    print(val1,type(val1))
    import json
    v2 = [11,22,33]
    val2 = json.dumps(v2)
    print(val2,type(val2))
    

2.shutil

import shutil
#删除目录/文件夹,不能删文件
shutil.rmtree('目录')

#重命名
shutil.move('原名.txt','新名.txt')

#压缩 shutil.make_archive(指定压缩包路径和名称,压缩格式,文件夹路径)
shutil.make_archive('压缩包名(不带后缀)','zip','D:\a\b\c')

#解压shutil.unpack_archive(压缩包路径和名称,指定解压存放路径,压缩包格式)
shutil.unpack_archive('压缩包名(带上后缀)',extract_dir=r'D:\d\e\f',format='zip')

from datetime import datetime
# 按年月日时分秒显示当前时间
Now_time = datetime.now().strftime('%Y-%m-%d %H-%M-%S')

import os
import shutil

# 如果没有Test文件夹就创建
if not os.path.exists('Test'):
    os.makedirs('Test')
# 将xxx文件夹压缩到Test中并以当前时间命名
shutil.make_archive(os.path.join('Test',Now_time),'zip','xxx')

# 将压缩包解压到yyy文件夹中
file_path = os.path.join('Test',Now_time) + '.zip'
shutil.unpack_archive(file_path,r'D:/Py_Learn/yyy','zip')

3.time / datetime

  1. UTC/GMT:世界时间

  2. 本地时间:本地时区时间

3.1time模块

  • time.time() 时间戳

    • 1970年0点0分到当前时间所经历的总秒数(起始时间是伦敦时间)
  • time.sleep(10) 等待的秒数

  • time.timezone

3.2datetime模块

import time
C_time = time.time()
from datetime import datetime

# datetime转为str
v1 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(v1)

# str转为datetime
v2 = datetime.strptime('2018-11-18','%Y-%m-%d')
print(v2)

# 时间戳转为datetime
v3 = datetime.fromtimestamp(C_time)
print(v1)

# datetime转为时间戳
v4 = datetime.now().timestamp()
print(v4)

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():
    try:
        return a.strip()
    except Exception as e:
        pass
    return False

v = func('alex  ')
if not v:
    print('函数执行失败')
else:
    print(v)

习题

#写函数,函数接收一个列表,请将列表中的元素每个都加100
def fun(arg):
    result = []
    for item in arg:
        if item.isdecimal():
            result.append(int(item) + 100)
    return result

#写函数,函数接受一个列表,列表中都是url,请访问每个地址并获取结果。  
Lst = ['http://www.bing.com'
       'http://www.google.com'
       'http://www.baidu.com']
#示例一
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
#示例二
import requests
def func(url_list):
    result = []
    for url in url_list:
    	try:   # 遇到异常循环不会终止
    		response = requests.get(url)
    		result.append(response.text)
    	except Exception as e:
        	pass
    return result

总结

1.函数高级 ▲▲▲

  • 嵌套
  • 装饰器

2.模块分类和定义 ▲

  • 内置模块

    • os

    • sys

    • ...

  • 第三方模块

    • requests
    • xlrd
  • 自定义模块

    • 文件
    • 文件夹 + _ _ init.py _ _(包)

3.导入模块

  • sys.path
  • 导入
    • import xxx
    • from xxx import xxx

4.异常处理

try:
    pass
except Exception as e:
    pass
posted @ 2020-03-19 05:37  Sco_Lunatic  阅读(91)  评论(0)    收藏  举报