python 内置模块(一)

本文详细介绍Python中datetime模块和time模块的使用方法,包括日期时间的获取、格式转换、加减运算,以及时间戳的处理。同时,介绍了commands模块在Linux环境下的应用和subprocess模块在跨平台下的命令执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python内置模块

在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转换为时间戳 timestamp
timestamp也就是常说的时间戳,表示自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后面的参数还有minutessecondsmicroseconds

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)。
  1. 返回时间戳(timestamp)的方法
    time() 无参数
    mktime() 参数为struct_time
  2. 返回元组(struct_time)的方法
    localtime() 无参数
    gmtime() 参数为timestamp
    strptime() 参数为str
  3. 返回字符串(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
>>> commands.getoutput("uname -a")
'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'
>>> commands.getoutput("uname -r")
'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
>>> commands.getstatusoutput("uname -r")
(0, '3.10.0-693.el7.x86_64')
>>> commands.getstatusoutput("uname -a")
(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')
>>> commands.getstatusoutput("ls -l /eee/dd")
(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命令返回执行结果。


>>> PIDS = subprocess.getoutput("netstat -aon | findstr 0:80")
>>> print(PIDS)
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
>>> PIDS1 = subprocess.getoutput("netstat -aon | grep 0:80")
>>> print(PIDS1)
'grep' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

getstatusoutput(cmd)

该命令类似commands模块中的getstatusoutput(),执行cmd命令返回包含2个元素的元组。
第一个元素为命令执行状态(int),如果执行成功返回0,不成功返回非0。
第二个元素为命令执行结果(str)。

>>> import subprocess
>>> PIDS = subprocess.getstatusoutput("netstat -aon | findstr 0:80")
>>> 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')
>>> PIDS1 = subprocess.getstatusoutput("netstat -aon | grep 0:80")
>>> print(PIDS1)
(255, "'grep' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。")
>>> status, result = subprocess.getstatusoutput("netstat -aon | grep 0:80")    #python中典型使用方法
>>> 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
>>> a = subprocess.call("ls")    #单个不带参数的命令可直接执行
anaconda-ks.cfg
>>> print(a)    #命令执行结果
0
>>> b = subprocess.call("ls -l")    #带参数命令直接传入将会报错
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
>>> b = subprocess.call(["ls", "-l"])    #带参数命令以列表方式传入
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
>>> a = subprocess.call("ls -l", shell=True)   #带参数命令也可直接传入
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
>>> a = subprocess.check_call(["ls", "-l"])
total 4
-rw-------. 1 root root 2523 Apr 21  2016 anaconda-ks.cfg
>>> print(a)
0
>>> a = subprocess.check_call("ls -l", shell=True)
total 4
-rw-------. 1 root root 2523 Apr 21  2016 anaconda-ks.cfg
>>> print(a)
0
>>> b = subprocess.check_call("exit 1", shell=True)    #即使正确执行命令,但返回值不为0抛出异常
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
>>> a = subprocess.check_output("ls -l", shell=True)
>>> print(a)    #输出为执行结果
total 4
-rw-------. 1 root root 2523 Apr 21  2016 anaconda-ks.cfg

>>> b = subprocess.check_output("exit 1", shell=True)
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
>>> subprocess.run("dir", shell=True)
 驱动器 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)
>>> subprocess.run("exit 1", shell=True, check=True)
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.
>>> subprocess.run("netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE)
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
>>> p = subprocess.Popen("netstat -aon|findstr 0:80", shell=True, stdout=subprocess.PIPE)
>>> 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
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write('print(1) \n')    #返回写入的字符数
10
>>> obj.stdin.write('print(2) \n')
10
>>> obj.stdin.write('print(3) \n')
10
>>> out,err = obj.communicate()
>>> print(out)
1
2
3

>>> print(err)

总结

  1. Python2.4版本引入了subprocess模块用来替换os.system()、os.popen()、os.spawn*()等函数以及commands模块;也就是说如果你使用的是Python 2.4及以上的版本就应该使用subprocess模块了。
  2. 如果你的应用使用的Python 2.4以上,但是是Python 3.5以下的版本,Python官方给出的建议是使用subprocess.call()函数。Python 2.5中新增了一个subprocess.check_call()函数,Python 2.7中新增了一个subprocess.check_output()函数,这两个函数也可以按照需求进行使用。
  3. 如果你的应用使用的是Python 3.5及以上的版本,Python官方给出的建议是尽量使用subprocess.run()函数。
  4. 当subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()这些高级函数无法满足需求时,我们可以使用subprocess.Popen类来实现我们需要的复杂功能。

更多关于subprocess说明可点击查看官方文档。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值