Python编程快速上手-保持时间、计划任务和启动程序
time模块
time.time()函数返回自那一刻以来的秒数
>>> import time >>> time.time() 1651629220.041479
可以用于一段代码的运行时间计算
1 #!/usr/bin/env python 2 3 import time 4 def calcProd(): 5 # Calculate the product of the first 100,000 numbers. 6 product = 1 7 for i in range(1, 100000): 8 product = product * i 9 return product 10 11 startTime = time.time() 12 prod = calcProd() 13 endTime = time.time() 14 print('The result is %s digits long.' % (len(str(prod)))) 15 print('Took %s seconds to calculate.' % (endTime - startTime))
1 C:\PyProjects>C:/Python37/python3.exe c:/PyProjects/time.py 2 The result is 456569 digits long. 3 Took 5.874201059341431 seconds to calculate.
另一种剖析代码的方法时利用cProfile.run()函数,它提供详细的信息
time.sleep()函数,让程序暂停。
>>> import time >>> for i in range(3): ... print('Tick') ... time.sleep(1) ... print('Tock') ... time.sleep(1) ... Tick Tock Tick Tock Tick Tock >>>
数字四舍五入
Python内置的round()函数,按照指定的精度四舍五入到一个浮点数。
>>> import time >>> now = time.time() >>> now 1651631445.498358 >>> round(now, 2) 1651631445.5 >>> round(now, 4) 1651631445.4984 >>> round(now) 1651631445 >>>
datetime模块
time模块用于取出Unix纪元时间戳,并加以处理。如果以更方便的格式显示日期,或对日期进行算数运算。就应该使用datetime模块。
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2022, 5, 4, 10, 49, 1, 71253) >>> dt = datetime.datetime(2022, 5, 4, 10, 49, 1) >>> dt.year, dt.month, dt.day (2022, 5, 4) >>> dt.hour, dt.minute, dt.second (10, 49, 1)
Unix纪元时间戳可以通过datetime.datetime.fromtimestamp(),转换为datetime对象。datetime对象的日期和时间将根据本地时区转换。
>>> datetime.datetime.fromtimestamp(1000000000) datetime.datetime(2001, 9, 9, 9, 46, 40) >>> >>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2022, 5, 4, 10, 53, 1, 574991) >>>
datetime对象可以用比较操作符进行比较
>>> halloween2015 = datetime.datetime(2015, 10, 31, 0, 0, 0) >>> newyears2016 = datetime.datetime(2016, 1, 1, 0, 0, 0) >>> oct31_2015 = datetime.datetime(2015, 10, 31, 0, 0, 0) >>> halloween2015 == oct31_2015 True >>> newyears2016 > halloween2015 True >>> newyears2016 != oct31_2015 True >>>
timedelta数据类型
datetime模块,提供了timedelta数据类型,它表示一段时间。而不是一个时刻。
>>> delta = datetime.timedelta(days=11, hours=10, minutes=9, seconds=8) >>> delta.days, delta.seconds, delta.microseconds (11, 36548, 0) >>> delta.total_seconds() 986948.0 >>> str(delta) '11 days, 10:09:08' >>>
datetime.timedelta()函数接收关键性参数weeks、days、hours、minutes、seconds、milliseconds和microseconds,没有month和year关键字参数,因为"月" 和"年"时可变的时间,依赖于特定月份和年份。total_seconds() 方法返回只以秒表示的时间。
算术运算符可以用于对datetime值进行日期运算。
>>> dt = datetime.datetime.now() >>> dt datetime.datetime(2022, 5, 4, 15, 57, 18, 22181) >>> thousandDays = datetime.timedelta(days=1000) >>> dt + thousandDays datetime.datetime(2025, 1, 28, 15, 57, 18, 22181) >>>
利用+和- 运算符,timedelta对象与datetime对象或其他timedelta对象相加或相减。利用*和/ 运算符,timedelta对象可以乘以或除以整数或浮点数。
>>> oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0) >>> aboutThirtyYears = datetime.timedelta(days=365 * 30) >>> oct21st datetime.datetime(2015, 10, 21, 16, 29) >>> oct21st - aboutThirtyYears datetime.datetime(1985, 10, 28, 16, 29) >>> oct21st - (2 * aboutThirtyYears) datetime.datetime(1955, 11, 5, 16, 29) >>>
暂停直到特定日期
time.sleep()方法可以暂停程序若干秒。利用一个while循环,可以让程序暂停,直到一个特定日期。
#!/usr/bin/env python import datetime import time halloween2016 = datetime.datetime(2016, 10, 31, 0, 0, 0) while datetime.datetime.now() < halloween2016: time.sleep(1)
将datetime对象转换为字符串
strftime()方法,将datetime对象显示为字符串 。
>>> oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0) >>> oct21st.strftime('%Y/%m/%d %H:%M:%S') '2015/10/21 16:29:00' >>> oct21st.strftime('%I:%M %p') '04:29 PM' >>> oct21st.strftime("%B of %y") 'October of 15' >>>
将字符串转换成datetime对象
datetime.datetime.strftime()函数:将字符串转换为datetime日期
datetime.datetime.strptime()函数:将格式字符串传入strptime(),解析为日期字符串
>>> datetime.datetime.strptime('October 21, 2015', '%B %d, %Y') datetime.datetime(2015, 10, 21, 0, 0) >>> datetime.datetime.strptime('2015/10/21 16:29:00', '%Y/%m/%d %H:%M:%S') datetime.datetime(2015, 10, 21, 16, 29) >>> datetime.datetime.strptime("October of 15", "%B of %y") datetime.datetime(2015, 10, 1, 0, 0) >>> datetime.datetime.strptime("November of 63", "%B of %y") datetime.datetime(2063, 11, 1, 0, 0)
从Python启动其他程序
向Popen()传递命令行参数
利用内建的subprocess模块中的Popen()函数,Python程序可以启动计算机中的其他程序。
在Windows系统
>>> import subprocess >>> subprocess.Popen('C:\\Windows\\System32\\calc.exe') <subprocess.Popen object at 0x000001C801C74BE0>
Ubuntu Linux系统
>>> import subprocess >>> subprocess.Popen('/usr/bin/gnome-calculator')
subprocess.Popen('C:\\Windows\\System32\\calc.exe')返回值时一个Popen对象,它有两个方法:poll()和wait()
>>> calcProc = subprocess.Popen('C:\\Windows\\System32\\calc.exe') >>> calcProc.poll() == None True >>> calcProc.wait() 0 >>> calcProc.poll() 0
向Popen()传递命令行参数
向Popen()传递一个列表,作为唯一的参数。该列表中的第一个字符串时要启动的程序的可执行文件名,所有后续的字符串将是该程序启动时,传递给该程序的命令行参数。实际上,这个列表将作为被启动程序的sys.argv的值。
>>> subprocess.Popen(['C:\\Windows\\notepad.exe', 'C:\\hello.txt']) <subprocess.Popen object at 0x000001C801C74DD8> >>>
运行其他Python脚本
向Popen传入一个列表,其中包含Python可执行文件的路径字符串,以及脚本文件名的字符串。
>>> subprocess.Popen(['C:\\python37\\python3.exe', 'C:\\PyProjects\\hello.py']) <subprocess.Popen object at 0x000001C801C74E80>
用默认的应用程序打开文件
>>> import os >>> os.chdir('C:\\PyProjects') >>> fileObj = open('hello.txt', 'w') >>> fileObj.write('Hello world!') 12 >>> fileObj.close()
每个操作系统都有一个程序,其行为等价于双击文档文件来打开它。根据操作系统,向Popen()传入(windows)'start'、(OS X)'open'或(Ubuntu Linux)'see'。
>>> import subprocess >>> subprocess.Popen(['start', 'hello.txt'], shell=True) <subprocess.Popen object at 0x000001C801C74EB8> >>>