python内置模块
模块和目录的区别:是否有 __init__.py 文件,若无则是目录,有则是模块。
datetime 模块
datetime是进行日期和时间处理的标准库。
获取当前时间和日期
from datetime import datetime
nowtime = datetime.now() #获取当前日期和时间
print(nowtime) #输出结果:22018-04-24 15:59:42.417256
print(type(nowtime)) #输出结果:<class 'datetime.datetime'>
print(datetime.now().year) #输出结果:2018
print(datetime.now().month) #输出结果:4
print(datetime.now().day) #输出结果:24
datetime
是一个模块,其中包含
datetime
类,我们使用的是
datetime.now()
中是
datetime
这个类。
通过
from datetime import datetime
导入的才是
datetime
类,若仅导入
import datetime
,则需要使用
datetime.datetime.now()
方式使用。
datetime.now()
返回的是当前日期和时间,类型为datetime
。
格式转换
指定日期和时间
from datetime import datetime
print(datetime(2018, 5, 1, 11, 30)) #输出结果: 2018-05-01 11:30:00
datetime转换为str 字符串
使用datetime.strftime()
实现
from datetime import datetime
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S")) #输出结果:2018-04-24 16:11:41
datetime.now() 返回当前日期和时间。
str转换为datetime
使用datetime.strptime()
实现
from datetime import datetime
print(datetime.strptime('2018-04-20 18:30:00', '%Y-%m-%d %H:%M:%S')) #输出结果:2018-04-20 18:30:00
datetime转换为时间戳 timestamptimestamp
也就是常说的时间戳,表示自1970-01-01 00:00:00 UTC+00:00
以来的秒数。
使用timestamp()
实现
from datetime import datetime
print(datetime.now().timestamp()) #输出结果:1524558100.372925
时间戳timestamp转换为datetime
使用
fromtimestamp
实现
from datetime import datetime
print(datetime.fromtimestamp(1524497333.38282)) #输出结果:2018-04-23 23:28:53.382820
print(datetime.utcfromtimestamp(1524497333.38282)) #输出结果:2018-04-23 15:28:53.382820
此处
fromtimestamp
转换之后的datetime默认为本地时间,也就是计算机配置的时区对应的时间(本机为UTC+8:00)。
使用
utcfromtimestamp
转换之后的datetime为UTC标准时区的时间
- datetime加减
对日期进行向前或者向后的推算,使用timedelta
类1 2 3 4 5 6 7
from datetime import datetime from datetime import timedelta print(datetime.now()) #输出结果:2018-04-23 23:41:12.694505 print(datetime.now() + timedelta(hours=2)) #输出结果:2018-04-24 01:41:12.694505 print(datetime.now() - timedelta(hours=2)) #输出结果:2018-04-23 21:41:12.694505 print(datetime.now() - timedelta(weeks=1)) #输出结果:2018-04-16 23:41:12.694505 print(datetime.now() + timedelta(days=1)) #输出结果:2018-04-24 23:41:12.694505
timedelta
后面的参数还有minutes
、seconds
、microseconds
。
python中常用的日期时间格式化符号
1 2 3 4 5 6 7 8 9 | %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00=59) %S 秒(00-59) %c 本地相应的日期表示和时间表示 |
更多的格式化符号点击查看。
time
在time
模块中,函数gmtime()
、localtime()
和strptime()
以时间元组struct_time
形式返回。
首先介绍时间元组的表示格式
struct_time
时间格式time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=9, tm_min=3, tm_sec=26, tm_wday=1, tm_yday=114, tm_isdst=0)
索引值|属性|值
-|:-:|:-:
0|tm_year|年(如2015)
1|tm_mon|月,1-12
2|tm_mday|日,1-31
3|tm_hour|时,0-23
4|tm_min|分,0-59
5|tm_sec|秒,0-61
6|tm_wday|星期,0-6(0表示星期一)
7|tm_yday|一年中第几天(1-266)
8|tm_isdst|是否为夏令时。0,1,-1
说明tm_sec
取值范围为0-61是考虑了闰秒和双闰秒的因素。tm_isdst
中,使用夏令时为1,不使用夏令时为0,当不确定是否使用夏令时为-1。
夏令时(DST,Daylight Saving Time)指利用夏天天亮的早,人为的将时间提前一小时,以充分利用光照资源减少照明时间,从而节约照明。
time.time()
返回当前时间的时间戳。
1 2 | import time print(time.time()) #输出结果:1524531805.2834768 |
time.sleep()
线程推迟指定的时间运行,单位为秒。
time.clock()
在unix系统,返回进程时间,用秒表示的浮点数(时间戳)。
在windows系统,第一次调用返回的是进程运行的时间,第二次之后调用均返回自第一次调用以后到现在的运行时间。
1 2 3 4 5 6 | import time print(time.clock()) #输出结果:4.105467826269739e-07 time.sleep(1) #线程推迟1秒运行 print(time.clock()) #输出结果:1.0005993983026353 time.sleep(1) print(time.clock()) #输出结果:1.9998817625266034 |
time.localtime([secs)
将一个时间戳转换为当前时区的struct_time
,若未提供secs
参数,返回当前时间的struct_time
。
1 2 3 4 5 | import time print(time.localtime()) #输出结果:time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=9, tm_min=43, tm_sec=22, tm_wday=1, tm_yday=114, tm_isdst=0) print(time.localtime(1304575584.1361799)) #输出结果:time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=6, tm_sec=24, tm_wday=3, tm_yday=125, tm_isdst=0) |
time.gmtime([secs])
将一个时间戳转换为UTC时区的struct_time
,若未提供secs
参数,返回当前时间的对应的UTC时区struct_time
。
1 2 3 4 5 | import time print(time.gmtime()) #输出结果:time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=1, tm_min=46, tm_sec=28, tm_wday=1, tm_yday=114, tm_isdst=0) print(time.gmtime(1304575584.1361799)) #输出结果:time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=6, tm_min=6, tm_sec=24, tm_wday=3, tm_yday=125, tm_isdst=0) |
time.mktime(t)
将一个struct_time
转换为时间戳。
1 2 | import time print(time.mktime(time.localtime())) #输出结果:1524534556.0 |
time.asctime([t])
把一个表示时间的元组或者struct_time
表示为Sun Jun 20 23:21:05 1993
形式,若没有参数,将会time.localtime()
作为参数传入。
1 2 | import time print(time.asctime(time.localtime())) #输出结果:Tue Apr 24 09:53:03 2018 |
time.ctime([secs])
把一个时间戳转换为Sun Jun 20 23:21:05 1993
形式,若没有参数或None的时候,默认将time.time()
作为参数。
1 2 3 | import time print(time.ctime()) #输出结果:Tue Apr 24 09:55:15 2018 print(time.ctime(1304575584.1361799)) #输出结果:Thu May 5 14:06:24 2011 |
time.strftime(format[,t])
把一个表示时间的元组或者struct_time
转换为格式化的时间字符串。如果未指定t(也就是表示时间的元组),传入time.localtime()
。如果元组中的任何一个元素越界,ValueError
错误将会被抛出。
1 2 | import time print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) #输出结果:2018-04-24 10:00:14 |
time.strptime(string[,format])
把一个格式化时间字符串转换为struct_time
。也就是strftime()
的逆操作。
当不指定字符串格式时,format
默认格式为”%a %b %d %H:%M:%S %Y”(下面第二行的格式)。
1 2 3 4 5 | import time print(time.strptime("2018-04-24 10:00:14", "%Y-%m-%d %H:%M:%S")) #输出结果:time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=10, tm_min=0, tm_sec=14, tm_wday=1, tm_yday=114, tm_isdst=-1) print(time.strptime("Tue Apr 24 10:03:14 2018")) #输出结果:time.struct_time(tm_year=2018, tm_mon=4, tm_mday=24, tm_hour=10, tm_min=3, tm_sec=14, tm_wday=1, tm_yday=114, tm_isdst=-1) |
- 总结
在time模块中,一共有3种时间表示方式,分别是timstamp
(时间戳)、struct_time
(元组)和格式化字符串
(str)。
- 返回时间戳(timestamp)的方法
time() 无参数
mktime() 参数为struct_time - 返回元组(struct_time)的方法
localtime() 无参数
gmtime() 参数为timestamp
strptime() 参数为str - 返回字符串(str)的方法
asctime() 参数为struct_time
ctime() 参数为timestamp
strftime() 参数为struct_time
更多的关于time
模块内容点击查看。
commands 模块
commands
是linux下特有的模块,用来执行linux命令。cmd代表系统命令。
注意:在python3.X中该模块已移除,使用subprocess
替代。下面均为linux系统中python2.7.5
环境执行结果。
getoutput(cmd)
getoutput(cmd)
返回结果为cmd命令的执行结果(字符串)。
1 2 3 4 5 | import commands "uname -a") commands.getoutput('Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux' "uname -r") commands.getoutput('3.10.0-693.el7.x86_64' |
getstatusoutput(cmd)
getstatusoutput(cmd)
返回包含2个元素的元组。
第一个元素为命令执行状态(int),如果执行成功返回0,不成功返回非0。
第二个元素为命令执行结果(str)。
1 2 3 4 5 6 7 | import commands "uname -r") commands.getstatusoutput((0, '3.10.0-693.el7.x86_64') "uname -a") commands.getstatusoutput((0, 'Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux') "ls -l /eee/dd") commands.getstatusoutput((512, 'ls: \xe6\x97\xa0\xe6\xb3\x95\xe8\xae\xbf\xe9\x97\xae/eee/dd: \xe6\xb2\xa1\xe6\x9c\x89\xe9\x82\xa3\xe4\xb8\xaa\xe6\x96\x87\xe4\xbb\xb6\xe6\x88\x96\xe7\x9b\xae\xe5\xbd\x95') |
python中更为常用的是status, result = commands.getstatusoutput("uname -a")
命令,通过一一对一个的方式赋值给status和result。
subprocess
subprocess
模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值。
getoutput(cmd)
该命令类似commands
模块中的getoutput()
,执行cmd
命令返回执行结果。
"netstat -aon | findstr 0:80") PIDS = subprocess.getoutput( print(PIDS) TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 "netstat -aon | grep 0:80") PIDS1 = subprocess.getoutput( print(PIDS1)'grep' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
getstatusoutput(cmd)
该命令类似commands
模块中的getstatusoutput()
,执行cmd
命令返回包含2个元素的元组。
第一个元素为命令执行状态(int),如果执行成功返回0,不成功返回非0。
第二个元素为命令执行结果(str)。
import subprocess "netstat -aon | findstr 0:80") PIDS = subprocess.getstatusoutput(#输出结果为元组 print(PIDS) (0, ' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\n TCP 192.168.0.102:64793 111.202.100.60:80 TIME_WAIT 0') "netstat -aon | grep 0:80") PIDS1 = subprocess.getstatusoutput( print(PIDS1)(255, "'grep' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。") "netstat -aon | grep 0:80") #python中典型使用方法 status, result = subprocess.getstatusoutput( print(status)255 print(result)'grep' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
call()
参数说明
1
| subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
|
执行命令并返回执行状态,其中shell参数为False
时,命令需要以列表的方式传入,当shell为True
时,可直接传入命令。默认情况下shell=False
。shell=False
情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import subprocess "ls") #单个不带参数的命令可直接执行 a = subprocess.call(anaconda-ks.cfg #命令执行结果 print(a) 0 "ls -l") #带参数命令直接传入将会报错 b = subprocess.call(Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 524, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory "ls", "-l"]) #带参数命令以列表方式传入 b = subprocess.call([total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg print(b)0 |
shell=True
情况
1 2 3 4 5 6 | import subprocess "ls -l", shell=True) #带参数命令也可直接传入 a = subprocess.call(total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg print(a)0 |
check_call()
参数说明
1
| subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) |
执行命令,若返回状态码为0,则返回0
,否则抛出异常CalledProcessError
。
注意:该方法等价于python3.5中的run(..., check=True)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import subprocess "ls", "-l"]) a = subprocess.check_call([total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg print(a)0 "ls -l", shell=True) a = subprocess.check_call(total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg print(a)0 "exit 1", shell=True) #即使正确执行命令,但返回值不为0抛出异常 b = subprocess.check_call(Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 542, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 |
check_output()
语法说明
1
| args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None |
执行命令,若返回状态码为0,则返回执行结果
,否则抛出异常CalledProcessError
。
注意:该方法等价于python3.5中的run(..., check=True, stdout=PIPE).stdout
1 2 3 4 5 6 7 8 9 10 11 12 | import subprocess "ls -l", shell=True) a = subprocess.check_output(#输出为执行结果 print(a) total 4 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg "exit 1", shell=True) b = subprocess.check_output(Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 |
run()
python 3.5添加的函数。
语法说明:
1
| subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None)
|
执行指定命令,等待命令执行完成后返回一个包含执行结果的CompleteProcess
类的实例。
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 | "dir", shell=True) subprocess.run( 驱动器 C 中的卷没有标签。 卷的序列号是 A001-9D89 C:\Users\xiaohuihui 的目录 2018/04/19 20:30 <DIR> . 2018/04/19 20:30 <DIR> .. 2017/11/17 10:16 <DIR> .android ............................................ ........................................... 2018/01/23 16:23 0 2.txt 2018/04/16 06:45 <DIR> 3D Objects 2018/04/13 20:28 4 bacon.txt 8 个文件 1,029,964,132 字节 24 个目录 94,803,804,160 可用字节 CompletedProcess(args='dir', returncode=0) "exit 1", shell=True, check=True) subprocess.run(Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\xiaohuihui\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 418, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1. "netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE) subprocess.run(CompletedProcess(args='netstat -aon|findstr 0:80', returncode=0, stdout=b' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\r\n') |
参数说明
subprocess中的call()
、check_call()
、check_output()
以及run()
参数列表已经列出,下面是参数的说明
- args
要执行的shell命令,默认是一个字符串序列,如['df', '-hT']
或('df', '-hT')
,也可以是一个字符串,如'df -hT'
,但此时需要把shell参数的值设置为True
。 - shell
如果shell为True,那么指定的命令将通过shell执行。如果需要访问某些shell特性,如管道、文件名通配符等,这将非常有用。 - check
如果check参数的值是True,且执行命令的进程以非0的状态码退出,则会抛出一个CalledProcessError
异常,且该异常对象会包含参数、退出状态码以及stdout和stderr(若被捕获)。 - stdout/stderr
程序的标准输出和错误输出。 - run()函数默认不会捕获命令执行结果的正常输出和错误输出,如果我们想获取这些内容,需要传递
subprocess.PIPE
然后可以通过返回的CompleteProcess
类实例的stddout和stderr属性捕获相应的内容。 - call()和check_call()函数返回的是命令执行的状态码而不是
CompleteProcess
类实例,所以它们的stdout和stderr不适合赋值为subprocess.PIPE
。 - check_output()函数默认会返回执行结果,所以不用设置stdout的值,如果希望在结果中捕获错误信息,可以设置
stderr = subprocess.STDOUT
。 - cwd
用于设置子进程的当前目录。当它不为None时,子程序在执行前,它的当前路径会被替换成cwd的值。这个路径并不会被添加到可执行程序的搜索路径,所以cwd不能是相对路径。 - input
该参数是传递给Popen.communicate()
,通常该参数的值必须是一个字节序列,如果universal_newline=True
,则其值应该是一个字符串。 - universal_newline
该参数影响的是输入输出的数据格式,默认为False,此时stdout和stderr的输出是字节序列,设置为True时stdout和stderr的输出是字符串。
CompleteProcess类说明
subprocess.CompleteProcess
类在python3.5中才存在,表示一个已经结束进程的状态信息,包含的属性如下
- args:用于加载进程的参数,可能是一个列表或者一个字符串。
- returncode:子进程的退出状态码,通常情况下状态码为0表示进程成功运行;负值
-N
表示子进程被信号N终止。 - stdout:从子进程捕获的stdout。这通常是一个字节序列,如果run()函数被调用时指定
universal_newlines=True
,则该属性值是一个字符串。如果run()函数被调用时指定stderr=subprocess.STDOUT
,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为None - stderr:从子进程捕获的stderr。它的值与stdout一样,是一个字节序列或一个字符串。如果stderr没有被捕获的话,它的值就为None
- check_returncode(): 如果
returncode
是一个非0值,则该方法会抛出一个CalledProcessError
异常。
Popen
该类用于在一个新的进程中执行一个子程序。上面介绍的函数都是基于subprocess.Popen
类实现的,通过使用这些被封装后的高级函数可以很方便的完成一些常见的需求。当无法通过上面的高级函数实现一些不太常用的功能时,可以通过subprocess.Popen
来完成。
示例1
1 2 3 4 | import subprocess "netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE) p = subprocess.Popen( print(p.stdout.read())b' TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4\r\n' |
示例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | "python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) obj = subprocess.Popen(['print(1) \n') #返回写入的字符数 obj.stdin.write(10 'print(2) \n') obj.stdin.write(10 'print(3) \n') obj.stdin.write(10 out,err = obj.communicate() print(out)1 2 3 print(err) |
总结
- Python2.4版本引入了subprocess模块用来替换os.system()、os.popen()、os.spawn*()等函数以及commands模块;也就是说如果你使用的是Python 2.4及以上的版本就应该使用subprocess模块了。
- 如果你的应用使用的Python 2.4以上,但是是Python 3.5以下的版本,Python官方给出的建议是使用subprocess.call()函数。Python 2.5中新增了一个subprocess.check_call()函数,Python 2.7中新增了一个subprocess.check_output()函数,这两个函数也可以按照需求进行使用。
- 如果你的应用使用的是Python 3.5及以上的版本,Python官方给出的建议是尽量使用subprocess.run()函数。
- 当subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()这些高级函数无法满足需求时,我们可以使用subprocess.Popen类来实现我们需要的复杂功能。
更多关于subprocess说明可点击查看官方文档。