美文网首页PythonPython
第十五章 Python_常用内置模块

第十五章 Python_常用内置模块

作者: 热爱_生活 | 来源:发表于2020-01-02 19:36 被阅读0次

    一、sys 模块

    import sys
    sys.argv         # 命令行参数列表,第一个元素是程序本身路径;用于接收执行
                     # Python 脚本时传的参数
    # 示例:
    python3 echo.py  a b c
    
    # echo.py 文件内容
    import sys
    print(sys.argv[1:])
    
    # 输出结果
    ['a', 'b', 'c']
    
    sys.exit(n)    # 退出程序,正常退出时exit(0)
    sys.version    # 获取Python解释程序的版本信息
    sys.platform   # 返回操作系统平台名称
    
    


    二、os 模块

    import os
    # 获取当前工作目录,即当前python脚本工作的目录路径
    os.getcwd()
    
    # 切换当前脚本工作目录;相当于shell下cd
    os.chdir("./dirname")      
    
    # 创建单级目录,相当于 shell 中的 mkdir dirname
    os.mkdir('dirname')
    
    # 递归创建目录
    os.makedirs('dir1/dir2')
    
    # 删除单级空目录,若目录非空则无法删除,并报错。
    os.rmdir('dirname') 
    
    # 递归删除 空 目录
    os.removedirs('dir1/dir2')  
    
    # 列出指定目录下的所有文件和目录,包括隐藏文件,并以列表方式打印
    os.listdir('dirname')
    
    # 递归查找目录下的文件和目录,返回一个生成器对象。
    # 生成器对象是个可迭代对象,每一层包含了三个值:
    # 1\. 当前目录路径,2\. 其下面的所有子目录, 3\. 其下面的所有文件
    os.walk('dirname')
    
    ### 练习需求 ###
    1.  在 /tmp 目录下,创建目录  a/b/c
    2.  进入到 /tmp/a/b 目录下,创建一个目录 f
    3.  把当前的工作目录写到 f 目录下的 work.txt 文件内。
    4.  删除目录 c
    5.  把 /tmp 目录下及其子目录下的所有文件和目录打印到屏幕上
    
    

    os.path.exists("path")

    path 需要时字符串类型
    如果path存在,返回True;如果path不存在,返回False 在这里值得注意的是,
    在Linux shell 中,Python会认为: / 左边一定是一个目录,而不是文件

    >>> os.path.exists("/etc/passwd")
    True
    >>> os.path.exists("/etc/passwd/")
    False
    >>> os.path.exists("/etc/ddd")
    False
    >>>
    
    


    os.path.isdir("path")

    如果path是一个存在的目录,则返回True。否则返回False



    os.path.isfile("path")

    如果path是一个存在的文件,返回True。否则返回False



    os.remove('/path/ot/file')

    删除一个文件



    os.rename("old_name", "new_name")

    重命名文件名或目录名



    os.path.split("path")

    将 path 分割成目录和文件名二元组返回

    >>> import os
    >>> os.path.split("/etc/nginx/nginx.conf")
    ('/etc/nginx', 'nginx.conf')
    >>> nginx_dir, nginx_conf = os.path.split("/etc/nginx/nginx.conf")
    >>> nginx_dir
    '/etc/nginx'
    >>> nginx_conf
    'nginx.conf'
    >>>
    
    

    注意: 这里并不关心路径是否真实存在与当前系统中



    os.path.abspath("path")

    返回 文件 或 path 规范化的绝对路径

    >>> os.path.abspath("/path/to/file")
    '/path/to/file'
    >>> os.path.abspath("./file")
    '/Users/yanshunjun/file'
    >>> os.path.abspath("~/.bashrc")
    '/Users/yanshunjun/~/.bashrc'
    >>> os.path.abspath("~/file")
    '/Users/yanshunjun/~/file'
    >>> os.path.abspath("$HOME/file")
    '/Users/yanshunjun/$HOME/file'
    
    

    不支持 shell 的 变量

    os.path.dirname(path) -- 重要

    以 最右侧的路径分隔符为分界符把路径分隔为两部分, 返回第一部分,就是目录部分。
    不关心路径是否真实存在与系统中

    >>> os.path.dirname('/path/to/file')
    '/path/to'
    >>> os.path.dirname('/path/to/file/')
    '/path/to/file'
    >>>
    
    

    os.path.join(path1[, path2[, ...]]) -- 常用

    将多个路径组合后返回,每个路径之间不需要加路径分隔符(\或者/)

    >>> os.path.join('/home', 'tom', 'bin')
    '/home/tom/bin'
    >>> os.path.join('/home', '/tom', 'bin')
    '/tom/bin'
    >>>
    
    


    三、时间模块

    Py3.7 官方文档 time 模块

    1. time 模块

    在Python中,通常有这几种方式来表示时间:

    • 时间戳(timestamp):
      通常来说,它是自Unix时代以来经过的秒数,即UTC( "世界标准时间")时间 1970 年1月1日 00:00:00 到目前经过了多少秒。

      >>> import time
      >>> time.time()
      1576916012.8988988
      >>> type( time.time() )
      <class 'float'>
      >>>
      
      
    • 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,当月中第几周,一年中第几天,夏令时)

      本地时间的结构化时间

      >>> time.localtime()
      time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, 
      tm_min=16, tm_sec=28, tm_wday=5, tm_yday=355, tm_isdst=0)
      >>>
      
      
      属性                            值
      tm_year(年)                  比如2011 
      tm_mon(月)                   1 - 12
      tm_mday(日)                  1 - 31
      tm_hour(时)                  0 - 23
      tm_min(分)                   0 - 59
      tm_sec(秒)                   0 - 61
      tm_wday(weekday)             0 - 6(0表示周一)
      tm_yday(一年中的第几天)        1 - 366
      tm_isdst(是否是夏令时)        默认为 0
      
      
    • 格式化的时间字符串(Format String)

    >>> time.strftime("%Y-%m-%d %X")
    '2019-12-21 16:17:34'
    >>> time.strftime("%F %T")
    '2019-12-21 16:17:42'
    >>> time.strftime("%H%M%S")
    '161836'
    >>>
    
    

    格式化时间的变量:

    格式 含义
    %a 本地(locale)简化星期名称
    %A 本地完整星期名称
    %b 本地简化月份名称
    %B 本地完整月份名称
    %c 本地相应的日期和时间表示
    %d 一个月中的第几天(01 - 31)
    %H 一天中的第几个小时(24小时制,00 - 23)
    %I 第几个小时(12小时制,01 - 12)
    %j 一年中的第几天(001 - 366)
    %m 月份(01 - 12)
    %M 分钟数(00 - 59)
    %p 本地am或者pm的相应符
    %S 秒(01 - 61)
    %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
    %w 一个星期中的第几天(0 - 6,0是星期天)
    %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
    %x 本地相应日期
    %X 本地相应时间
    %y 去掉世纪的年份(00 - 99)
    %Y 完整的年份
    %Z 时区的名字(如果不存在为空字符)
    %% ‘%’字符

    时间的互相转换

    image.png
    >>> import time
    >>> time.time()
    1576917412.379858
    
    # 时间戳转换为结构化时间
    >>> time.localtime(1576917412.379858)
    time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=0)
    >>>
    
    # 将 结构化时间或者时间戳转换为 格式化后的字符串时间
    >>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1576917412.379858))
    '2019-12-21 16:36:52'
    >>>
    
    
    # 将 字符串时间转换为结构化时间
    >>> time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S')
    time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=-1)
    >>>
    
    # 将 指定的字符串时间转换为时间戳
    >>> time.mktime(time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S'))
    1576917412.0
    
    

    其他日志格式转换(扩展)

    # 将指定的时间戳转换为  Apa
    In [178]: time.ctime(1093849081)
    Out[178]: 'Mon Aug 30 14:58:01 2004'
    
    In [179]: time.asctime(time.localtime())
    Out[179]: 'Mon Mar 26 21:49:41 2018'
    
    In [183]: time.strptime('Mon mar 04 21:53:42 2018')
    
    In [182]: time.strptime('Mon mar 04 21:53:42 2018', "%a %b %d %H:%M:%S %Y")
    
    

    其他方法

    当前进程休眠 10 秒

    >>> time.sleep(10)
    
    

    获取到微秒

    >>> time.perf_counter()
    1546.612138963
    
    

    2. datetime 模块

    时间加减

    In [ 192 ]: import datetime
    
    In [193]: str(datetime.datetime.now())
    Out[193]: '2018-03-26 22:09:44.424473'
    
    In [194]: datetime.datetime.now() + datetime.timedelta(3)
    Out[194]: datetime.datetime(2018, 3, 29, 22, 10, 42, 315584)
    
    In [196]: datetime.datetime.now() + datetime.timedelta(minutes=30)
    Out[196]: datetime.datetime(2018, 3, 26, 22, 41, 32, 44547)
    
    

    时间格式转换

    >>> datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m %T')
    '2019-12 16:56:42'
    >>> datetime.date.strftime(datetime.datetime.now(),'%Y-%m %T')
    '2019-12 16:56:52'
    >>>
    
    

    创建一个文件,文件名为格式为: 自己名字的全拼秒.txt
    写入一行内容: 当天的日期,格式为: 今天是:当前年
    当前月_当前日
    例如:
    文件名: yanshunjun1107.txt
    内容如下:

    今天是:2019年03月_29日
    
    

    查询目前服务器哪些是半年时间到期的,到期的具体时间和对应的服务器
    现有的数据 服务列表,IP , 到期日期 够买时间
    以当前时间点计算 + 到期日期

    预约倒计时

    nowtime = datetime.datetime.now()
    restime = datetime.datetime.strptime("2019-09-05 12:00:00",'%Y-%m-%d %H:%M:%S')
    restime - nowtime
    t = restime - nowtime
    print(str(t))
    
    t.days
    
    h,s = divmod(t.seconds, 3600)
    m,s =divmod(s,60)
    
    f"{t.days}天{h}小时{m}分{s}秒"
    
    

    交互式

    import datetime,time
    inp = input("请输入预约时间(1970-1-1 00:00:00)")
    nowtime = datetime.datetime.now()
    restime = datetime.datetime.strptime(inp,'%Y-%m-%d %H:%M:%S')
    t = restime - nowtime
    if t.days >= 0 :
        h,s = divmod(t.seconds, 3600)
        m,s =divmod(s,60)
        print(f"{t.days}天{h}小时{m}分{s}秒")
    else:
        print("时间无法倒流!")
    
    
    import datetime
    
    def handle_seconds(second):
        t = datetime.timedelta(seconds=second)
    
        # 计算多少小时,多少秒
        # 一个小时 3600 秒,这里divmod 内置函数取商数和余数
        h,s = divmod(t.seconds, 3600)
    
        # 计算多少分钟和多少秒
        m,s =divmod(s,60)
    
        if t.days > 0 :
            tpl = "{days}天{h}小时{m}分{s}秒"
            msg = tpl.format(days=t.days, h=h, m=m, s=s)
        elif t.days == 0 and h > 0:
            tpl = "{h}小时{m}分{s}秒"
            msg = tpl.format(h=h, m=m, s=s)
        elif h == 0 and m > 0:
            tpl = "{m}分{s}秒"
            msg = tpl.format(m=m, s=s)
        elif m == 0 and s > 0:
            tpl = "{s}秒"
            msg = tpl.format(s=s)
        else:
            msg = "刚刚"
        print(msg)
    
    

    学习 计划任务模块
    参考资料

    apscheduler.schhenduler



    四、压缩打包模块 (扩展自修)

    shutil 是 Python3 中高级的文件 文件夹 压缩包 处理模块

    拷贝文件

    拷贝文件的内容到另一个文件中,参数是文件的相对路径或者绝对路径

    import shutil
    shutil.copyfile('./src.file','./dst.file')
    
    

    拷贝文件和权限

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

    递归拷贝

    递归的去拷贝文件夹

    shutil.copytree(src, dst, symlinks=False, ignore=None)

    shutil.copytree('/home','/tmp/hbak',
                    ignore=shutil.ignore_patterns('*.txt'))
    # 递归拷贝一个文件夹下的所有内容到另一个目录下,目标目录应该是原来系统中不存在的
    
    

    shutil.ignore_patterns(patterns)* 忽略某些文件

    ignore=shutil.ignore_patterns('排除的文件名', '排除的文件夹名') 支持通配符,假如有多个用逗号隔开

    删除

    递归删除一个文件夹下的所有内容

    shutil.rmtree('/tmp/hb')
    shutil.rmtree('/tmp/hbad/')
    
    # 最后结尾的一定是明确的文件名,不可以类似下面这样
    shutil.rmtree('/tmp/hbak/*')
    
    

    递归的去移动文件,它类似mv命令。

    shutil.move('/home/src.file', './shark') 
    
    

    创建压缩包并返回文件路径,例如:zip、tar

    # 将 /home/shark 目录下的所以文件打包压缩到当前目录下,
    # 名字 shark,格式 gztar。扩展名会自动根据格式自动生成。
    
    shutil.make_archive('shark',         # 压缩后文件名
                        'gztar',         # 指定的压缩格式
                        '/home/shark/')  # 被压缩的文件夹名字
    
    # 将 /home/shark 目录下的所以文件打包压缩到 /tmp 目录下,名字shark,格式 tar
    shutil.make_archive( '/tmp/shark','tar','/home/shark/')
    
    # 查看当前 python 环境下支持的压缩格式
    ret = shutil.get_archive_formats()
    print(ret)
    
    

    解压缩

    #                     解压的文件名   解压到哪个路径下,压缩的格式
    shutil.unpack_archive('./a/b.tar.gz', './a/c/','gztar')
    
    


    五、subprocess 模块执行本机系统命令

    os.system() 执行的命令只是把命令的结果输出导终端,程序中无法拿到执行命令的结果。

    subprocess 是开启一个系统基本的单个进程,执行 shell 命令,可以得到命令的执行结果。

    # 在 shell 中运行命令,并且获取到标准正确输出、标准错误输出
    In [209]: subprocess.getoutput('ls |grep t')
    Out[209]: 'test.py' 
    
    In [222]: ret = subprocess.getstatusoutput('date -u')
    
    In [223]: ret
    Out[223]: (0, '2018年 03月 26日 星期一 14:46:42 UTC')
    

    相关文章

      网友评论

        本文标题:第十五章 Python_常用内置模块

        本文链接:https://www.haomeiwen.com/subject/uhoooctx.html