zoukankan      html  css  js  c++  java
  • python模块之os_sys_动态导入_包

    os模块:

    #!/usr/bin/env python
    # coding:utf-8
    
    import os
    
    
    print(os.getcwd())  #获取当前工作目录,即当前python脚本工作的目录路径
    # os.chdir("dirname")  #改变当前脚本工作目录;相当于shell下cd
    print(os.curdir)  # 返回当前目录: ('.') 所以一个点也是代表当前目录的意思
    print(os.pardir)  # 获取当前目录的父目录字符串名:('..')
    
    # print(os.makedirs('dirname1/dirname2'))  #  可生成多层递归目录
    # print(os.removedirs('dirname1/dirname2'))  #  若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    
    # os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
    # os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    
    print(os.listdir('./web')) #   列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 不会递归
    # 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  获取系统环境变量
    # os.path.abspath(path)  返回path规范化的绝对路径
    # os.path.split(path)  将path分割成目录和文件名二元组返回
    
    a = os.path.dirname(r"D:Python314 moduleos_test.py")
    b = os.path.basename("D:/Python3/14 module/os_test.py")
    print(a) #  返回path的目录。其实就是os.path.split(path)的第一个元素
    print(b)  #返回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[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    
    c = os.path.join(a,b) # 路径拼接会自动在里面加上反斜杠 
    print('----------->',c)
    # os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    # os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    
    if __name__ == "__main__":
        print(os.path.getmtime(__file__))
        print(__file__)

    os小例子:

    #!/usr/bin/env python
    # coding:utf-8
    
    import os
    import os.path
    """获取指定目录及其子目录下的 py 文件路径。说明:lis 用于存储找到的 py 文件路径。 get_py 函数,递归查找并存储 py 文件路径到 lis 中 """
    lis = []
    def get_py(path,lis):
        fileList = os.listdir(path)   #获取path目录下文件
        for filename in fileList:
            pathTmp = os.path.join(path,filename)   #获取path与filename组合后的路径
            if os.path.isdir(pathTmp):   #如果是目录
                get_py(pathTmp,lis)        #则递归查找
            elif filename[-3:].upper()=='.PY':   #不是目录,则比较后缀名
                lis.append(pathTmp)
    path = input('请输入路径:').strip()
    get_py(path,lis)
    print('在%s目录及其子目录下找到%d个py文件
    分别为:
    '%(path,len(lis)))
    for filepath in lis:
        print(filepath+'
    ')

    os小例子:查找某些文件

    #!/usr/bin/env python
    # coding:utf-8
    
    import os
    
    ## 查找某些文件 
    def search_file(start_dir, target):
        os.chdir(start_dir)
    
        for each_file in os.listdir(os.curdir):
            ext = os.path.splitext(each_file)[1]
            if ext in target:
                vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep)
            if os.path.isdir(each_file):
                search_file(each_file, target)  # 递归调用
                os.chdir(os.pardir)  # 递归调用后切记返回上一层目录
    
    
    start_dir = input('请输入待查找的初始目录:')
    program_dir = os.getcwd()
    
    target = ['.mp4', '.avi', '.rmvb'] # 指定文件类型
    vedio_list = []
    
    search_file(start_dir, target)
    
    f = open(program_dir + os.sep + 'vedioList.txt', 'w')
    f.writelines(vedio_list)
    f.close()

    sys 模块

    #!/usr/bin/env python
    # coding:utf-8
    
    import sys
    
    print(sys.argv) # 使用命令行运行此脚本时可接受传入参数 例如: python3 sys_test.py abc ddd fff
    
    # cmd = sys.argv[1]
    # path = sys.argv[2]
    #
    # if cmd =="post":
    #     pass
    # elif cmd =="get":
    #     pass
    
    
    import  time
    # 简单模拟进度条
    for i in range(100):
        sys.stdout.write("#")
        time.sleep(0.1)
        sys.stdout.flush()
        
        
    ## 更多参考: http://www.cnblogs.com/cherishry/p/5725184.html

    一个模块导入时路径的问题:

    当前目录有bin.py文件和my_mod文件夹,my_mod文件夹下有ma.py和cal.py文件。

    而os和sys正好用来解决my_mod/ma.py导入cal模块, 以及被bin.py导入的路径问题

    #!/usr/bin/env python
    # coding:utf-8
    # cal.py
    
    # print('before...')
    
    def add(x,y):
        return x+y
    
    
    def sub(x,y):
        return x-y
    
    # print('end....')
    if __name__ == "__main__": # 用于本文件的调试
        print('testing....')
    
    
    print(__name__) # 被调用时将打印出文件名(模块名)
    #!/usr/bin/env python
    # coding:utf-8
    # ma.py
    
    # import cal # 直接执行本文件时,用此方式导入
    
    # from my_mod import cal  # 被上一级调用时,用此方式导入。
    
    import sys,os
    
    BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    print(BASE_DIR)
    print(os.path.abspath(__file__)) # 本文件的绝对路径
    
    #  加入项目所在路径, 同时解决本身的运行和被调用时的路径问题。
    sys.path.append(BASE_DIR)
    
    from my_mod import cal
    
    def run():
        print(cal.add(7,5))
    
    run()
    #!/usr/bin/env python
    # coding:utf-8
    # bin.py
    
    from my_mod import ma
    
    # ma.run()
    
    ## 模块的种类 :
    # 1. 内置模块
    # 2. 第三方模块
    # 3. 自定义模块
    
    ### 包 和 文件夹 的区别: 是否有 __init__.py 文件
    
    if __name__ =="__main__": # 假设将当前脚本作为主函数,仅可执行,不允许被调用。 可以避免反复调用带来的坑
        ma.run()

    动态导入模块: 参考: https://www.cnblogs.com/zy6103/p/6943557.html

    #!/usr/bin/env python
    # coding:utf-8
    
    # 动态导入的方法:
    
    # mt = __import__('m1.t') # 只能导入最顶级模块 点后面的不会被导入
    # print(mt)
    # m1.t.test1()
    #
    # from m1.t import test1,_test2
    #
    # test1()
    # _test2()
    
    import importlib
    
    m = importlib.import_module('m1.t') # 动态导入就是基于反射的
    
    print(m)
    m.test1()
    m.test2()
    
    '''
    动态导入模块方法1: __import__ 
    
    说明:
    
      1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。
    
      2. __import__(module)相当于import module
    
    举例说明:
    
    首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py
    
    模块代码为:
    
    class c(object):
        def __str__(self):
            return 'C language'
    在lib目录平级新建一个测试的模块,使用 __import__ 动态以字符串形式导入lib下的aa模块。
    
    lib = __import__('lib.aa') # 相当于import lib
    c = lib.aa.c()
    print(c)
    动态导入模块方法2:import importlib
    
    实例还是上面的lib.aa模块,这里使用importlib进行动态导入(这个方法好理解,也是官方建议使用的)
    
    import importlib
    aa = importlib.import_module('lib.aa')
    c = aa.c()
    print(c)
    '''

     如果自定义的模块中有写    __all__ = ['read','read2']    # 此方法的列表中只和 import * 有关系
    被导入后则只能使用 列表中列出的内容。

    包: 类似于文件夹,例如 当前项目day20 下有 glance目录,下面又有 api, cmd, db 三个子目录,

    import glance
    glance.db.models.register_models('mysql')
    glance.api.policy.get()
    glance.cmd.manage.ma()

    想要使用glance 下面子目录中的模块,则需要每级目录下面的  __init__.py  有相应的导入动作. 这样,整个glance包内的模块都可以使用了。

    第三方软件安装:

    1. pip包管理器

    2. 源码安装: 下载,解压, 执行python setup.py build 编译, 执行 python setup.py install 安装

  • 相关阅读:
    转 python 的几个内置函数(lambda ,zip, filter, map, reduce )用法
    给明年依然年轻的我们
    青春易逝,留白抱憾
    ubuntu ××.10和××.04分别代表什么意思
    mysql创建用户的一些问题
    解藕的小例子
    《Getting Real》读书笔记
    宏中常用到的属性和方法
    宏生成图表
    Excel的一些常用操作,给自己记录一下,呵呵!
  • 原文地址:https://www.cnblogs.com/frx9527/p/python_os.html
Copyright © 2011-2022 走看看