• 模块sys, os, glob, pickle, subprocess常见用法


    参考python常用标准库 http://blog.51cto.com/lizhenliang/1872538

     

    一. sys

     

    1. sys.argv

    脚本名1.py, 命令行中执行python 1.py a b c, 脚本基本内容如下
     
    import sys
    print sys.argv[0]         #1.py,输出脚本名
    print sys.argv[1]         #a,输出第一个参数
    print sys.argv             #['1.py', 'a', 'b', 'c'], 输出脚本名和所有参数
    print len(sys.argv)      #算上脚本名长度为4

    2. 标准输入

    a.py的标准输出作为b.py的标准输入

    # cat a.py
    import sys
    sys.stdout.write("123456 ")
    sys.stdout.flush()
     
    # cat b.py
    import sys
    print sys.stdin.readlines()
     
    命令行中执行 python a.py | python b.py    输出结果为:['123456 ']
     
     

    3. 实时动态输出信息,每隔一秒输出数字

    import sys
    import time
     
    for i in range(5):
        print i,
        sys.stdout.flush()
        time.sleep(1)
     

     

    二. os模块

     

    1. os.makedirs:在当前路径递归创建文件夹,例如当前目录为/home/axinfu

    注意:os.makedirs("./abc/b"), 不能写成os.makedirs("home/axinfu/abc/b"),这样会在当前目录下再创建一个home目录。
     

    2. 目录树生成器os.walk(path)

    os.walk 的返回值是一个生成器(generator),也就是说我们需要不断的遍历它,来获得所有的内容。

    每次遍历的对象都是返回的是一个三元组(root,dirs,files)

    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)


    例子1,假设目录结构如下
    /home/suyu/test目录下有文件1.py, 2.py, 3.py; 有文件夹dir1, dir2
    dir1下有文件dir1_1.py, dir1_2.py;  没有文件夹
    dir2下有文件dir2_1.py, dir2_2.py; 没有文件夹
     
    代码如下
    >>> for path, dir, file in os.walk('/home/suyu/test'):
    ...     print(path)
    ...     print(dir)
    ...     print(file)
    ... 
    
    /home/suyu/test
    ['dir1', 'dir2']
    ['1.py', '2.py', '3.py']
    
    /home/suyu/test/dir1
    []
    ['dir1_2.py', 'dir1_1.py']
    
    /home/suyu/test/dir2
    []
    ['dir2_2.py', 'dir2_1.py']

     3. os.path分解目录

     
    3.1,拆分目录名和文件名
    >>> fname='/home/suyu/test/1.py'
    
    #方法1
    >>> basename=os.path.basename(fname)
    >>> basename
    '1.py'
    >>> dirname=os.path.dirname(fname)
    >>> dirname
    '/home/suyu/test'
    
    #方法2
    >>> dirname, basename = os.path.split(fname)
    >>> dirname
    '/home/suyu/test'
    >>> basename
    '1.py'

    3.2,拆分扩展名和文件名,接着用例子1中变量basename

    >>> root,extension = os.path.splitext(basename)
    >>> root
    '1'
    >>> extension
    '.py'

    3.3 如果想得到不到点号的扩展名,os.path.splitext(basename)[1][1:]即可

    >>> x=os.path.splitext(basename)
    >>> x
    ('1', '.py')  #元组类型
    >>> x[1]
    '.py'         #字符串类型
    >>> x[1][0]
    '.'
    >>> x[1][1:]  #字符串切片
    'py'

    3.4 改变文件扩展名

    >>> x=os.path.splitext(fname)
    >>> x
    ('/home/suyu/test/1', '.py')
    >>> x[0] + '.sh'
    '/home/suyu/test/1.sh'
     

    三. glob模块,文件查找,支持通配符(*、?、[])

     
    # 查找目录中所有以.sh为后缀的文件
    >>> glob.glob('/home/user/*.sh')
    ['/home/user/1.sh', '/home/user/b.sh', '/home/user/a.sh', '/home/user/sum.sh']
     
    # 查找目录中出现单个字符并以.sh为后缀的文件
    >>> glob.glob('/home/user/?.sh')
    ['/home/user/1.sh', '/home/user/b.sh', '/home/user/a.sh']
     
    # 查找目录中出现a.sh或b.sh的文件
    >>> glob.glob('/home/user/[a|b].sh')
    ['/home/user/b.sh', '/home/user/a.sh']

     

    四、pickle, 将不同数据类型直接写入文件,可用于数据加密

     
    示例1,python2中将字典写入到文件:
    >>> import pickle
    >>> dict = {'a':1, 'b':2, 'c':3}
    >>> f = open('data.pkl', 'wb')  # 二进制模式打开文件
    >>> pickle.dump(dict, f)   # 执行完导入操作,当前目录会生成data.pkl文件
    >>> f.close()  # 写入数据并关闭
     
    读取序列化文件:
    >>> f = open('data.pkl')
    >>> data = pickle.load(f)
    >>> print data
    {'a': 1, 'c': 3, 'b': 2}

    例子2,在python2和python3中对比写入列表

    python2中

    import pickle
    D=[1,2,3,4]
    pickle.dump(D,file('Data.pkl','w'))
    pickle.load(file('Data.pkl')

    python3中

    import pickle
    D=[1,2,3,4]
    pickle.dump(D,open('Data.pkl','wb'))
    pickle.load(open('Data.pkl','rb'))

    python3改写一下格式,和例子1中的python2对比,区别只有读取文件时,多了个'rb' 参数

    import pickle
    list1=[1,2,3,4]
    
    # 写入文件
    f = open('data.pkl', 'wb')
    pickle.dump(list1,f)
    f.close()
    
    #读取文件
    with open('x.pkl', 'rb') as f:
        data=pickle.load(f)
        print(data)


    五、subprocess,用于执行shell命令

     
    1. subprocess.call():运行命令与参数。等待命令完成,返回执行状态码。
    >>> import subprocess 
    >>> retcode = subprocess.call(["ls", "-l"]) 
    total 2
    1.txt
    2.txt
    >>> retcode #正确执行就返回0
    0
    
    #命令错误的话就返回非0
    >>> retcode = subprocess.call(["ls", "a"]) 
    ls: cannot access a: No such file or directory
    >>> retcode #执行失败就返回非0
    2
     
    #如果加上参数shell=True,命令可以用字符串的形式写
    >>> subprocess.call('ls -l', shell=True)

    2. subprocess.check_call()

    用法和subprocess.call相同,不同的地方就是执行命令错误的时候,可以输出比较详细的异常信息

    >>> subprocess.check_call("ls a", shell=True)
    #subprocess.check_call():运行命令与参数。如果退出状态码非0,引发CalledProcessError异常,包含状态码。
     
    ls: cannot access a: No such file or directory
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
        raise CalledProcessError(retcode, cmd)
    subprocess.CalledProcessError: Command 'ls a' returned non-zero exit status 2
    拓展:
    1. 用subprocess.check_call("ls -l a", shell=True),ls后面可以加任意参数,需要抛出异常的时候使用不错,如果没异常就会正常显示
    2. 使用第一种方法 retcode=subprocess.call(["ls","-l"])时,可以在列表中加入指定文件夹名,比如retcode=subprocess.call(["ls","-l","spider"]),把命令,参数,文件名都当作列表中的元素
    3. 还有一个subprocess.check_output(),用法类似,区别是当返回值为0时,直接输出结果;不为0时,直接抛出异常,只用于python3
     
     
    3)subprocess.Popen():
     
    例子1
    >>> p = subprocess.Popen('dmesg |grep eth0', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    >>> p.communicate() 
    
    # 返回结果类型为元组
    >>> p.pid  #获取子进程PID
    57039
    >>> p.wait() #等待子进程终止,返回状态码
    0
    >>> p.returncode #返回子进程状态码
    0
    说明:
    subprocess.PIPE提供了一个缓冲区,将stdout、stderr放到这个缓冲区中
    p.communicate()读取缓冲区数据。缓冲区的stdout、stderr是分开的,可以以p.stdout.read()方式获得标准输出、错误输出的内容。
     
     
     
    例子2:标准输出作为下个Popen任务的标准输入,当前目录有1.py,2,py,3.py 3个文件:
    >>> p1 = subprocess.Popen('ls', stdout=subprocess.PIPE, shell=True)
    >>> p2 = subprocess.Popen('grep py', stdin=p1.stdout, stdout=subprocess.PIPE, shell=True)
    >>> p1.stdout.close()   # 调用后启动p2,为了获得SIGPIPE,不明白
    >>> output = p2.communicate()[0] #这里的[0]貌似是指文件名,不明白
    >>> output
    b'1.py
    2.py
    3.py
    '
    p1的标准输出作为p2的标准输入。这个p2的stdin、stdout也可以是个可读、可写的文件。
     
     
     
    例子3:在指定文件夹的位置,新建文件夹. 
    import subprocess
    
    a = subprocess.Popen('mkdir hello', shell=True, cwd='/home/suyu')

    cwd指定目录位置

     
     
     
     
  • 相关阅读:
    在docker容器中访问宿主机端口
    springcloud ActiveMQ设置多个并行消费者
    Spring boot activeMQ 设置并行消费
    redis命令行如何清空缓存(windows环境下)
    一文读懂PostgreSQL-12分区表
    PostgreSQL 那些值得尝试的功能,你知道多少?
    Windows如何设置或更改PostgreSQL数据目录位置
    postgresql 致命错误: 已保留的连接位置为执行非复制请求的超级用户预留
    为什么没有插入数据,但已用存储空间会增加
    postgresql批量修改表的owner
  • 原文地址:https://www.cnblogs.com/regit/p/8515413.html
Copyright © 2020-2023  润新知