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

时间:2022-09-08 20:14:20

参考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\n")
sys.stdout.flush()
 
# cat b.py
import sys
print sys.stdin.readlines()
 
命令行中执行 python a.py | python b.py    输出结果为:['123456\n']
 
 

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
''
>>> extension
'.py'

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

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

3.4 改变文件扩展名

>>> x=os.path.splitext(fname)
>>> x
('/home/suyu/test/1', '.py')
>>> x[] + '.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}
>>> output = open('data.pkl', 'wb') # 二进制模式打开文件
>>> pickle.dump(dict, output) # 执行完导入操作,当前目录会生成data.pkl文件
>>> output.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
D=[1,2,3,4] # 写入文件
output = open('data.pkl', 'wb')
pickle.dump(D,output)
output.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\n2.py\n3.py\n'
p1的标准输出作为p2的标准输入。这个p2的stdin、stdout也可以是个可读、可写的文件。
 
 
 
例子3:在指定文件夹的位置,新建文件夹. 
import subprocess

a = subprocess.Popen('mkdir hello', shell=True, cwd='/home/suyu')

cwd指定目录位置

 
 
 
 

模块sys, os, glob, pickle, subprocess常见用法的更多相关文章

  1. Python常用模块sys&comma;os&comma;time&comma;random功能与用法,新手备学。

    这篇文章主要介绍了Python常用模块sys,os,time,random功能与用法,结合实例形式分析了Python模块sys,os,time,random功能.原理.相关模块函数.使用技巧与操作注意 ...

  2. day16 常用模块 sys os json pickle

          知识点 os:和操作系统相关sys:和解释器相关 json:和操作JSON(一种数据交换格式)相关pickle:序列化 hashlib:加密算法Collections:集合类型       ...

  3. 常用模块&lpar;random&comma;os&comma;json&comma;pickle&comma;shelve&rpar;

    常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...

  4. 第二十天 模块 sys os os下path settings random shuit

    一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version 获取Pythonn解释程 ...

  5. devi into python 笔记(五)异常 文件操作 sys os glob模块简单实用

    异常: Java异常: try catch块处理异常,throw引发异常. Python异常: try except块处理异常,raise引发异常. 异常如果不主动处理,则会交给Python中的缺省处 ...

  6. 常用模块 time sys os json pickle

    # import time # print(time.time()) #秒数 # print('开始下载') # time.sleep(2) # print('下载完成') # print(time. ...

  7. python---基础知识回顾(四)(模块sys&comma;os&comma;random&comma;hashlib&comma;re&comma;序列化json和pickle,xml,shutil,configparser,logging,datetime和time,其他)

    前提:dir,__all__,help,__doc__,__file__ dir:可以用来查看模块中的所有特性(函数,类,变量等) >>> import copy >>& ...

  8. python 模块二&lpar;os&comma;json&comma;pickle&rpar;

    #################################总结##################### os常用 os.makedirs('baby/安哥拉/特斯拉/黄晓明') os.mkd ...

  9. 模块 –SYS

    模块 –SYS os模块是跟操作系统的交互 sys是跟python解释器的交互 sys.argv 命令行参数List,第一个元素是程序本身路径 返回一个列表 In [218]: sys.argv Ou ...

随机推荐

  1. C&num;基础——系统登录功能的实现

    一般的登陆界面,都是利用用户名和密码在数据库的匹配关系,来实现登陆的跳转功能. 首先介绍用户数据表的设计. 其中ID列需要设置好增量标识,随着用户的增加,ID的值递增,避免重复. 然后是C#中对数据库 ...

  2. Play on Words&lbrack;HDU1116&rsqb;

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. 【STL】-auto&lowbar;ptr的用法

    初始化: #include<memory> //auto_ptr header void f() { auto_ptr<classA> ptr(new classA); } 拷 ...

  4. XCODE7新变化之-test

    Xcode 7新鲜出炉,一大早下载下来就安装上了,急急地体验一把.这几天公司给的任务是单元测试,那我们一起来用新版本做一次测试吧. 除了官方发布的下载链接地址,分享本人的xcode 7下载地址,大家不 ...

  5. PDF解决方案(2)--文件转PDF

    相关专题链接: PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇中讲到的文件上传,文件上传 ...

  6. POJ1741

    树分治,每次把每个点的deep取出,排序...尺取法... # include <stdio.h> # include <stdlib.h> # include <ios ...

  7. 讲一下Asp&period;net core MVC2&period;1 里面的 ApiControllerAttribute

    先贴文章链接 正文 ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的, ...

  8. sublime text 3 笔记 简单配置

    一.首先我们去sublime text 3 去下载(http://www.sublimetext.com/) 下载完成后,打开页面 二.汉化 1.如图所示,点击菜单栏中“preferences”,弹出 ...

  9. bzoj1645 &sol; P2061 &lbrack;USACO07OPEN&rsqb;城市的地平线City Horizon(扫描线)

    P2061 [USACO07OPEN]城市的地平线City Horizon 扫描线 扫描线简化版 流程(本题为例): 把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序 ...

  10. oracle直方图

    直方图 当某列数据分布不均衡.为了让CBO能生成最佳的运行计划,我们可能须要对表收集直方图,直方图最大的桶数(Bucket)是254. 收集直方图是一个很耗时的过程,如无必要.千万别去收集直方图. O ...