zoukankan      html  css  js  c++  java
  • 模块、包及常用模块(time/random/os/sys/shutil)

    一、模块

    模块的本质就是一个.py 文件。

    导入和调用模块:

    import module
    
    from module import xx
    
    from module.xx.xx import xx as rename  
    
    from module.xx.xx import *

    模块调用时发生了三件事:

    import 
    1.创建名称空间
    2.执行模块文件
    3.在执行文件中创建一个名称 指向模块的名称空间
    from
    1.创建名称空间
    2.执行模块文件
    3.把模块中的名称复制到当前名称空间

    注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码

    python中有三种模块:
    1. 内置模块(内置于解释器中,不用导入,直接调用)
    2. 第三方模块(在lib目录下,导入后可以调用)
    3. 自定义模块(默认从当前工作目录下导入,导入后可以调用)
    python解释器对于模块的查找也是遵循上面的顺序。python模块丰富,后期涉及到的网络编程和线程进程,基本就是在学socket 和threading processing 这两个模块

    相对导入和绝对导入

    绝对导入的定义

    从sys.path开始的完整路径称之为绝对导入
    我们会发现
    1.如果你的包的层级比较复杂 写起来很长
    2.假如有一天 你需要修改包名 你需要将所有导入语句全改一遍
    为了解决这两个问题 我们最好使用相对导入

    相对导入的定义

    相对于被导入模块的路径
    语法 .表示当前目录 ..当前往上一级目录 ...上上级 以此类推
    注意:建议不要超过三层
    相对导入只能用于 包的内部模块之间相互导入

    二、包

    包也是一种模块

    对于使用者而言 使用方式和模块没有任何区别

    本质上就是一个文件夹 不同之处在于 多了一个__init__.py 叫包的初始化文件。

    在导入包的时候 由于包实际上是一个文件夹 不能被执行 所以包中需要提供__init__.py文件

    该文件用于代表这个包

    所以上面import pack 实际上时执行了pack下的__init___.py 导入了这个名称

    那么问题来了,__init__.py 的作用是什么?

    __init__.py文件的作用? ******
    说白了就是导入该包下的所有模块 这样一来使用包的人 用起来非常简单 无需关心包中的文件结构
    只要导入了包 就能使用包中的所有功能
    __init__.py 应该包含什么内容?
    不应该包含任何的业务逻辑 仅仅用于导入包中的模块

    导入语法:

    pack.sayhello()
    pack.m1.sayhi()
    pack.sayhi()
    pack.pack.m1

    三、常用模块汇总

    Time & Datetime 模块

    Time模块:

    三种表示方式:

    1、时间戳

    2、格式化的时间字符串

    3、元组(struct_time)共九个元素。

    三种形式之间的转换:

    结构化>>>时间戳:
    time.mktime(time.localtime())
    时间戳>>>结构化:
    time.localtime() 默认传入当前时间戳。

    结构化>>>字符串:
    time.strftime('%Y-%m-%d, time.localtime())
    字符串>>>结构化:
    time.strptime('2016-06-21', '%Y-%m-%d')

    另外两外两种转化字符串时间的方法: (老外习惯用的时间表示法)

    time.asctime() 默认把当前结构时间转化为字符串

    time.ctime() 默认把当前时间戳转化为字符串

    time.sleep() 睡眠。其实是一种I/O阻塞(类似的,input也是一种I/O阻塞,阻塞时,CPU会被调度到其它任务,因此不占CPU的)

    Datetime模块

    #时间加减
    import datetime
    
    # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
    #print(datetime.date.fromtimestamp(time.time()) )  # 时间戳直接转成日期格式 如2018-10-15
    # print(datetime.datetime.now() )
    # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
    # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
    # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
    # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
    
    # c_time  = datetime.datetime.now()
    # print(c_time.replace(minute=3,hour=2)) #时间替换

    Random模块(生成随机字符串)

    比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串随机数生成的模块

    常用的语法操作如下:

    >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10
    >>> random.randint(1,10) #返回1-10之间的一个随机数,包括10
    
    >>> random.randrange(0, 100, 2) #随机选取0到100间的偶数
    
    >>> random.random()  #返回一个随机浮点数
    >>> random.choice('abce3#$@1') #返回一个给定数据集合中的随机字符
    
    >>> random.sample('abcdefghij',3)  #从多个字符中选取特定数量的字符
    ['a', 'd', 'b']
    
    #洗牌
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> random.shuffle(a)
    >>> a
    [3, 0, 7, 2, 1, 6, 5, 8, 9, 4]

    小练习:

    生成随机字符串

    >>> import string 
    >>> ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) 
    '4fvda1'

    sys模块(解释器相关信息的模块)

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int值
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    sys.stdout.write('please:')  #标准输出 , 引出进度条的例子, 注,在py3上不行,可以用print代替
    val = sys.stdin.readline()[:-1] #标准输入
    sys.getrecursionlimit() #获取最大递归层数
    sys.setrecursionlimit(1200) #设置最大递归层数
    sys.getdefaultencoding()  #获取解释器默认编码
    sys.getfilesystemencoding  #获取内存数据存到文件里的默认编码

    os模块(与操作系统相关、对文件的处理、对路径的处理)

    常用语法操作:

    不带path:

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir(
    "dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量

    带path:
    os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小

    注意:关于处理路径的方法。

    os路径处理
    #方式一:推荐使用
    import os
    #具体应用
    import os,sys
    possible_topdir = os.path.normpath(os.path.join(
        os.path.abspath(__file__),
        os.pardir, #上一级
        os.pardir,
        os.pardir
    ))
    sys.path.insert(0,possible_topdir)
    
    
    #方式二:不推荐使用
    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    shutil模块(用于操作文件、包括压缩和解压)

    shutil.copyfileobj(fsrc, fdst[, length])
    将文件内容拷贝到另一个文件中

    import shutil
    shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

    shutil.copyfile(src, dst)
    拷贝文件

    shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在

    shutil.copymode(src, dst)
    仅拷贝权限。内容、组、用户均不变

    shutil.copymode('f1.log', 'f2.log') #目标文件必须存在

    shutil.copystat(src, dst)
    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

    shutil.copystat('f1.log', 'f2.log') #目标文件必须存在

    shutil.copy(src, dst)
    拷贝文件和权限

    import shutil
    shutil.copy('f1.log', 'f2.log')

    shutil.copy2(src, dst)
    拷贝文件和状态信息

    import shutil
    shutil.copy2('f1.log', 'f2.log')

    shutil.ignore_patterns(*patterns)
    shutil.copytree(src, dst, symlinks=False, ignore=None)
    递归的去拷贝文件夹

    import shutil
    shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除

    shutil.rmtree(path[, ignore_errors[, onerror]])
    递归的去删除文件

    import shutil
    shutil.rmtree('folder1')

    shutil.move(src, dst)
    递归的去移动文件,它类似mv命令,其实就是重命名。

    
    
    import shutil
    shutil.move('folder1', 'folder3')
    
    

    shutil.make_archive(base_name, format,...)
    创建压缩包并返回文件路径,例如:zip、tar
    创建压缩包并返回文件路径,例如:zip、tar

    base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

    如 data_bak =>保存至当前路径
    如:/tmp/data_bak =>保存至/tmp/

    format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”

    root_dir: 要压缩的文件夹路径(默认当前目录)

    owner: 用户,默认当前用户

    group: 组,默认当前组

    logger: 用于记录日志,通常是logging.Logger对象

    #将 /data 下的文件打包放置当前程序目录
    import shutil
    ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
    
    #将 /data下的文件打包放置 /tmp/目录
    import shutil
    ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')

    若想放在指定目录,在文件前加上指定目录的位置即可。

    shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

    zipfile压缩&解压缩

    
    
    import zipfile
    
    # 压缩
    z = zipfile.ZipFile('laxi.zip', 'w')
    z.write('a.log')
    z.write('data.data')
    z.close()
    # 解压
    z = zipfile.ZipFile('laxi.zip', 'r')
    z.extractall(path='.')
    z.close()
    
    

    tarfile压缩&解压缩

    
    
    import tarfile
    
    # 压缩
    >>> t=tarfile.open('/tmp/egon.tar','w')
    >>> t.add('/test1/a.py',arcname='a.bak')
    >>> t.add('/test1/b.py',arcname='b.bak')
    >>> t.close()
    
    
    # 解压
    >>> t=tarfile.open('/tmp/egon.tar','r')
    >>> t.extractall('/egon')
    >>> t.close()
    
    
    
     
  • 相关阅读:
    虚拟机的三种联网模式(桥接模式、NAT 模式、仅主机模式)
    Vue 分页器 Pagination 实现点击分页器,平滑到对应的dom组件,而不是直接切换对应的组件
    img图片的处理技巧
    Vue中在DOM组件上动态绑定数据
    vue3.0中使用postcss-pxtorem
    vue中实现点击div有样式去除样式 无样式添加样式
    网易云音乐API,的调用方法 ,vue项目中(在本地使用)
    我的mixin.scss文件
    kendo-ui 几个有用的数据操作
    开发中常见的common.js--1
  • 原文地址:https://www.cnblogs.com/wanlei/p/9791678.html
Copyright © 2011-2022 走看看