os 模块在运维工作中是很常用的一个模块。通过os模块调用系统命令。os模块可以跨平台使用。
说明:os模块是对操作系统进行调用的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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下为"\t\n",Linux下为"\n"
os.pathsep
#输出用于分割文件路径的字符串
os.name
#输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system(
"bash command"
)
#运行shell命令,直接显示
os.environ
#获取系统环境变量
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所指向的文件或者目录的最后修改时间
在 import os
的时候,建议使用import os
而非from os import *
。这样可以避免os.open()
不会覆盖内置函数open()
.
(1)os.name()
判断系统类型
import os
print os.name
# linux和Unix系统会返回`posix`
# windows 系统会返回`nt`
(2)os.system()
执行系统命令的模块,返回命令执行的状态码,开启一个子shell执行命令
import os
cmd = 'ifconfig'
retval = os.system(cmd)
print retval
# 结果为 0
# 表示命令执行成功,否则为失败
(3)os.popen()
popen
也是去执行一个命令,不过相比system(cmd),os.popen(command [, mode='r' [, bufsize]]),参数更多,而且是开启一个管道去执行。
import os
cmd = 'mkdir nwdir'
a = os.popen(cmd)
print a
print type(a)
#返回结果
#
#
(4)os.listdir(path)
打印指定目录的文件,返回一个列表
import os
a = os.listdir('/tmp')
print a
(5)os.getcwd()
返回当前绝对路径,返回类型为str
import os
a = os.getcwd()
print a
(6)os.chdir(path)
改变当前路径
import os
print os.getcwd()
os.chdir(/tmp/aaa)
print os.getcwd()
(7)os.mkdir()
mkdir(path [, mode=0755])
默认权限是0755
如果目录已存在,会异常OSError
(8)os.remove(path)
删除文件,只能删除文件
(9)os.rmdir(path)
删除目录,只能删除目录
回到顶部
(10)os.path
该模块主要是针对路径的操作。
(11)os.path.abspath(path)
返回绝对路径,主要有引号
import os
print os.path.abspath('.')
#结果
D:\Python\project
(12)os.path.basename(path)
返回文件名,类似linux
中的basename
命令
import os
print os.path.basename('D:\Python\project')
#结果
project
(13)os.path.dirname(path)
返回文件路径,不包含文件名,类似linux
中的dirname
命令
import os
print os.path.dirname('D:\Python\project')
#结果
D:\Python
(14)os.path.exists(path)
判断路径是否存在,存在返回True
,不存在返回False
a = 'D:\Python\project11111'
print os.path.exists(a)
#结果
False
类似这种:
命令 | 说明 |
---|---|
os.path.isfile | 判断是否是文件 |
os.path.isdir | 判断是否是目录 |
os.path.isline | 判断是否是个链接文件 |
os.path.ismount | 判断是否是挂载点 |
os.path.isabs | 判断是否是绝对路径 |
(15)os.path.join(path1,path2)
把 path1、path2文件或目录合并成一个路径
二、sys模块
sys模块包含了与Python解释器和它的环境有关的函数。当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能够被你 使用 。注意,初始化过程仅在我们 第一次 输入模块的时候进行。另外,“sys”是“system”的缩写。Sys模块函数之多,我只能选取自己认为比较实用的一些函数列在此处。借马云找员工的说法,”找最合适的而不是最天才的”,这句话,我个人觉得在很多方面都能适应,学习也不在话下。Sys模块功能的确很多,但我们应该将重点放在那些功能才是最适合我们的,为此,我列的这些函数,就是我认为比较适合我以后开发的函数。
1
2
3
4
5
6
7
8
sys.argv
#命令行参数List,第一个元素是程序本身路径
sys.exit(n)
#退出程序,正常退出时exit(0)
sys.version
#获取Python解释程序的版本信息
sys.maxint
#最大的Int值
sys.path
#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform
#返回操作系统平台名称
sys.stdout.write(
'please:'
)
val
=
sys.stdin.readline()[:
-
1
]
很多人会想,我如何给我的程序在外部传递参数呢?这个,就可以实现。如:
Tesy.py
Import sys
Print sys.argv[number]
一般情况下,number为0是这个脚本的名字,1,2…则为命令行下传递的参数.如:
Test.py脚本内容:
import sys
print sys.argv[0]
print sys.argv[1]
print sys.argv[2]
print sys.argv[3]
那么
[root@databak scripts]# python test.py arg1 arg2 arg3
test.py
arg1
arg2
arg3
看到,对应的关系了吗?
sys模块中的argv变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的argv变量冲突。另外,它也清晰地表明了这个名称是sys模块的一部分。
sys.argv变量是一个字符串的 列表 (列表会在后面的章节详细解释)。特别地,sys.argv包含了 命令行参数 的列表,即使用命令行传递给你的程序的参数。
这里,当我们执行python using_sys.py we are arguments的时候,我们使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序。Python为我们把它存储在sys.argv变量中。
记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,'using_sys.py'是sys.argv[0]、'we'是sys.argv[1]、'are'是sys.argv[2]以及'arguments'是sys.argv[3]。注意,Python从0开始计数,而非从1开始。
(2)sys.platform
大家都知道,当今的程序比较流行的是跨平台。简单的说就是这段程序既可以在windows下,换到linux下也可以不加修改的运行起来,听起来就不错。所以,这个函数就可以派上用场了。
假设,我们想实现一个清除终端,linux下用clear, windows下用cls
Ostype=sys.platform()
If ostype==”linux” or ostype==”linux2”:
Cmd=”clear”
Else:
Cmd=”cls”
(3) sys.exit(n)
执行至主程序的末尾时,解释器会自动退出. 但是如果需要中途退出程序, 你可以调用sys.exit 函数, 它带有一个可选的整数参数返回给调用它的程序. 这意味着你可以在主程序中捕获对sys.exit 的调用。(注:0是正常退出,其他为不正常,可抛异常事件供捕获!)
sys.exit从python程序中退出,将会产生一个systemExit异常,可以为此做些清除除理的工作。这个可选参数默认正常退出状态是0,以数值为参数的范围为:0-127。其他的数值为非正常退出,还有另一种类型,在这里展现的是strings对象类型。
(4)sys.path
大家对模块都有一定了解吧?大家在使用模块的某一个功能前,是不是需要导入呢?答案是需要。那import,__import__命令就不用提干嘛的了吧。那大家在执行import module_name的时候,python内部发生了什么呢?简单的说,就是搜索module_name。根据sys.path的路径来搜索module.name
>>> sys.path
['', '/usr/local/lib/python24.zip', '/usr/local/lib/python2.4', '/usr/local/lib/python2.4/plat-freebsd4', '/usr/local/lib/python2.4/lib-tk', '/usr/local/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages']
大家以后写好的模块就可以放到上面的某一个目录下,便可以正确搜索到了。当然大家也可以添加自己的模块路径。Sys.path.append(“mine module path”).
sys.path包含输入模块的目录名列表。我们可以观察到sys.path的第一个字符串是空的——这个空的字符串表示当前目录也是sys.path的一部分,这与PYTHONPATH环境变量是相同的。这意味着你可以直接输入位于当前目录的模块。否则,你得把你的模块放在sys.path所列的目录之一。首先,我们利用import语句 输入 sys模块。基本上,这句语句告诉Python,我们想要使用这个模块。sys模块包含了与Python解释器和它的环境有关的函数。
(5)sys.modules
This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks.
Python.org手册里已经说的很明白了。
For names in sys.modules.keys():
If names != ’sys’:
stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们
random() 函数中常见的函数如下
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import random
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') ) # 从序列中随机选取一个元素
print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数
a=[1,3,5,6,7] # 将序列a中的元素顺序打乱
random.shuffle(a)
print(a)
1.random.random()
#用于生成一个0到1的
随机浮点数:0<= n < 1.0
import random
random.random()
2.random.uniform(a,b)
#用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a
itertools是python内置的模块,使用简单且功能强大,这里尝试汇总整理下,并提供简单应用示例;如果还不能满足你的要求,欢迎加入补充。
使用只需简单一句导入:import itertools
与其名称意义一样,给它一个列表如 lists/tuples/iterables,链接在一起;返回iterables对象。
letters = ['a', 'b', 'c', 'd', 'e', 'f']
booleans = [1, 0, 1, 0, 0, 1]
print(list(itertools.chain(letters,booleans)))
# ['a', 'b', 'c', 'd', 'e', 'f', 1, 0, 1, 0, 0, 1]
print(tuple(itertools.chain(letters,letters[3:])))
# ('a', 'b', 'c', 'd', 'e', 'f', 'd', 'e', 'f')
print(set(itertools.chain(letters,letters[3:])))
# {'a', 'd', 'b', 'e', 'c', 'f'}
print(list(itertools.chain(letters,letters[3:])))
# ['a', 'b', 'c', 'd', 'e', 'f', 'd', 'e', 'f']
for item in list(itertools.chain(letters,booleans)):
print(item)
生成无界限序列,count(start=0, step=1) ,示例从100开始,步长为2,循环10,打印对应值;必须手动break,count()会一直循环。
i = 0
for item in itertools.count(100,2):
i += 1
if i > 10 : break
print(item)
Python filterfalse(contintion,data) 迭代过滤条件为false的数据。如果条件为空,返回data中为false的项;
booleans = [1, 0, 1, 0, 0, 1]
numbers = [23, 20, 44, 32, 7, 12]
print(list(itertools.filterfalse(None,booleans)))
# [0, 0, 0]
print(list(itertools.filterfalse(lambda x : x < 20,numbers)))
返回我们需要使用的元素,根据b集合中元素真值,返回a集中对应的元素。
print(list(itertools.compress(letters,booleans)))
# ['a', 'c', 'f']
针对list中的每一项,调用函数功能。starmap(func,list[]) ;
starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
>>> from itertools import *
>>> x = starmap(max,[[5,14,5],[2,34,6],[3,5,2]])
>>> for i in x:
>>> print (i)
14
34
5
repeat(object[, times]) 重复times次;
repeat(10, 3) --> 10 10 10
dropwhile(func, seq );当函数f执行返回假时, 开始迭代序列
dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
takewhile(predicate, iterable);返回序列,当predicate为true是截止。
takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
islice(seq[, start], stop[, step]);返回序列seq的从start开始到stop结束的步长为step的元素的迭代器
for i in islice("abcdef", 0, 4, 2):#a, c
print i
product(iter1,iter2, ... iterN, [repeat=1]);创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组,repeat是一个关键字参数,指定重复生成序列的次数
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
for i in product([1, 2, 3], [4, 5], [6, 7]):
print i
(1, 4, 6)
(1, 4, 7)
(1, 5, 6)
(1, 5, 7)
(2, 4, 6)
(2, 4, 7)
(2, 5, 6)
(2, 5, 7)
(3, 4, 6)
(3, 4, 7)
(3, 5, 6)
(3, 5, 7)
permutations(p[,r]);返回p中任意取r个元素做排列的元组的迭代器
for i in permutations([1, 2, 3], 3):
print i
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)
combinations(iterable,r);创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序
note:不带重复
for i in combinations([1, 2, 3], 2):
print i
(1, 2)
(1, 3)
(2, 3)
同上, 带重复 例子:
for i in combinations_with_replacement([1, 2, 3], 2):
print i
(1, 1)
(1, 2)
(1, 3)
(2, 2)
(2, 3)
(3, 3)
求质数序列中1,3,5,7,9,11,13,15三个数之和为35的三个数;
def get_three_data(data_list,amount):
for data in list(itertools.combinations(data_list, 3)):
if sum(data) == amount:
print(data)
#(7, 13, 15)
#(9, 11, 15)
colorsys模块提供了用于RGB和YIQ/HLS/HSV颜色模式的双向转换的接口。它提供了六个函数,其中三个用于将RGB转YIQ/HLS/HSV,另外三个用于将YIQ/HLS/HSV转为RGB。
colorsys.rgb_to_yiq(r, g, b)
colorsys.rgb_to_hls(r, g, b)
colorsys.rgb_to_hsv(r, g, b)
colorsys.yiq_to_rgb(y, i, q)
colorsys.hls_to_rgb(h, l, s)
colorsys.hsv_to_rgb(h, s, v)
需要注意的是:除了I和Q之外的其他参数取值都是在[0, 1]范围内的浮点数。所以传入RGB参数的时候还需要额外做一个除以255的操作。
>>> import colorsys
>>> colorsys.rgb_to_hsv(30/255, 50/255, 160/255)
(0.6410256410256411, 0.8125, 0.6274509803921569)
具体的转换算法在这就不介绍了,源码里都有,也就100多行,有兴趣阅读源码的同学可以在Python根目录/Lib目录下找到colorsys.py这个源文件。在这主要介绍一下模块中涉及到的四种颜色模型。
RGB是一种相加色,也就是根据红绿蓝三种光的相互叠加来显示不同的颜色,RGB三个字母分别代表红色Red、绿色Green和蓝色Blue。那些分辨率比较小的的显示器用手机拍出照片后放大看,就可以看到由红绿蓝三种颜色的发光管共同组成的一个像素,像素的颜色就是由这三个发光管的亮度决定的。
HLS也就是人们常说的HSL,分别代表色相Hue,亮度Lightness和饱和度Saturation。HSV也就是HSB,用过Photoshop的同学应该对HSB不陌生,它的三个字母分别代表色相Hue,饱和度Saturation和明度Value(Brightness)。
RGB在数学上可以用一个平面直角坐标系来表示,三个坐标轴分别代表红绿蓝三色的色值。但是用RGB来表示颜色时,颜色的变化对于人类来说并不是很直观,于是就产生了HSL和HSV。HSL和HSV通过对颜色信息的进一步封装,使其通过一种人类更加容易感知的形式来表示颜色变化。(色调的变化、亮度的变化、色彩纯度的变化)
HSL和HSV通过对RGB颜色模型进行变换,将原本的平面直角坐标系转换为一个圆柱坐标系。HSL颜色模型的顶端是白色,底端是黑色,可以用一个双六角锥体来表现。而HSV颜色模型可以用一个倒六角锥体来表示,锥体的顶点是黑色。下图来自英文维基百科,展现了RGB是怎么转换为HSL和HSV的:
注意:这两个颜色模型中对于色相的定义是相同的,但各自对于饱和度的定义是不同的。
下面两张同样来自维基百科的图片展示了这两个模型的差异:
YIQ颜色模型使用亮度Luminance和色度Chrominance来表示颜色。用一组坐标来表示颜色的变化,Q表示了颜色色调由紫到绿的变化,I表示了颜色色调由橙到蓝的变化。
关于YIQ的特点,百度百科-颜色空间作了以下总结
其实模块和源码倒没有什么难的,难的是几个颜色模型的概念,在bing和百度上找到的中文资料都非常有限。如果有读者对这方面感兴趣的,推荐你们读一下下面链接里的参考资料,有条件的最好买图像处理方面的专业书籍来看。