《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第15章 保持时间,计划任务和启动程序】

1.  time 模块

内置的 time 模块让 Python程序能读取系统时钟的当前时间。

1)  time.time()函数

Unix 纪元是编程中经常参考的时间:1970 年 1 月 1 日 0 点,即协调世界时(UTC)。time.time()函数返回自那一刻以来的秒数,是一个浮点值(回想一下,浮点值只是一个带小数点的数)。这个数字称为 UNIX 纪元时间戳。示例:

>>> import time

>>> time.time()

1521155982.183911

注:另一种剖析代码的方法是利用 cProfile.run()函数。与简单的 time.time()技术相比,它提供了详细的信息。

2)  time.sleep()函数

如果需要让程序暂停一下,就调用 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

2.  数字四舍五入:round()

可以用 Python 内置的round()函数按照指定的精度四舍五入到一个浮点数。只要传入要舍入的数字,再加上可选的第二个参数,指明需要传入到小数点后多少位。如果省略第二个参数,round()将数字四舍五入到最接近的整数。示例:

>>> import time

>>> now = time.time()

>>> now

1425064108.017826

>>> round(now, 2)

1425064108.02

>>> round(now, 4)

1425064108.0178

>>> round(now)

1425064108

3.  datetime 模块

time模块用于取得Unix纪元时间戳,但是如果要更方便的取得日期,就需要使用datetime模块。调用 datetime.datetime.now()返回一个 datetime 对象,表示当前计算机的日期和时间。这个对象包含当前时刻的年、月、日、时、分、秒和微秒。示例:

>>> import datetime

>>> datetime.datetime.now()

datetime.datetime(2018, 3, 16, 8, 56, 44, 895652)

>>> dt = datetime.datetime(2018, 2, 15, 7, 55, 43)

>>> dt.year, dt.month, dt.day

(2018, 2, 15)

>>> dt.hour, dt.minute, dt.second

(7, 55, 43)

Unix 纪元时间戳可以通过 datetime.datetime.fromtimestamp(),转换为datetime对象。示例:

>>>datetime.datetime.fromtimestamp(11111111111)

datetime.datetime(2322,2, 6, 3, 45, 11)

>>>datetime.datetime.fromtimestamp(time.time())

datetime.datetime(2018,3, 16, 9, 12, 39, 662010)

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

>>>halloween2015 > newyears2016

False

>>>newyears2016 > halloween2015

True

>>>newyears2016 != oct31_ _2015

True

1)  timedelta 数据类型

datetime 模块还提供了timedelta 数据类型,它表示一段时间,而不是一个时刻。

a)     使用datetime.timedelta()函数创建timedelta数据。接受关键字参数 weeks、days、hours、minutes、seconds、milliseconds 和 microseconds。没有 month 和 year 关键字参数

b)     timedelta 对象拥有的总时间以天、秒、微秒来表示。这些数字分别保存在 days、seconds 和microseconds 属性中。

c)     total_seconds()方法返回只以秒表示的时间。

d)     将一个 timedelta 对象传入 str(),将返回格式良好的、人类可读的字符串表示。

示例:

>>> import datetime

>>> 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'

e)     利用+和-运算符,timedelta 对象与 datetime 对象或其他 timedelta 对象相加或相减。利用*和/运算符,timedelta 对象可以乘以或除以整数或浮点数。示例:

计算当前时间后的100天日期。

>>> import datetime

>>> dt = datetime.datetime.now()

>>> hundredDays =datetime.timedelta(days = 100)

>>> dt + hundredDays

datetime.datetime(2018, 6, 24, 11, 13, 3,828899)

2)  将 datetime 对象转换为字符串

时间戳和datetime对象对人来说都不是友好可读的。利用strftime()方法可以将datetime对象转为适合人可读的字符串。(strftime()函数名中的f 表示格式,format)。

示例:

>>>oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)

>>>oct21st.strftime('%Y-%m-%d  %H:%M:%S')

'2015-10-21  16:29:00'

3)  将字符串转换成 datetime 对象

使用strptime()函数可以将字符串转换成datetime对象(strptime()函数名中 p 表示解析,parse)。示例:

>>>datetime.datetime.strptime('October 21, 2015','%B %d, %Y')

datetime.datetime(2015, 10, 21, 0, 0)

4.  多线程

1)  向线程的目标函数传递参数

如果想在新线程中运行的目标函数有参数,可以将目标函数的参数传入threading.Thread()。常规参数可以作为一个列表,传递给threading.Thread()中的 args 关键字参数。关键字参数可以作为一个字典,传递给threading.Thread()中的kwargs 关键字参数。示例:

>>> import threading

>>> threadObj = threading.Thread(target=print,args=['Cats', 'Dogs', 'Frogs'],

kwargs={'sep': ' & '})

>>> threadObj.start()

Cats & Dogs & Frogs

2)  并发问题

为了避免并发问题,绝不让多个线程读取或写入相同的变量。当创建一个新的Thread 对象时,要确保其目标函数只使用该函数中的局部变量。这将避免程序中难以调试的并发问题。

5.  从 Python 启动其他程序

使用subprocess模块的Popen()函数,Python 程序可以启动计算机中的其他程序(Popen()函数名中的 P 表示process,进程)。如果你打开了一个应用程序的多个实例,每个实例都是同一个程序的不同进程。

每个进程可以有多个线程。不像线程,进程无法直接读写另一个进程的变量。

示例(打开计算器):

>>>import subprocess

>>>subprocess.Popen('C:\\Windows\\System32\\calc.exe')

<subprocess.Popenobject at 0x000001878919E0F0>

Popen() 方法返回Popen()对象,它有两个有用的方法poll()和wait().

可以认为 poll()方法是问你的朋友,她是否执行完毕你给她的代码。如果这个进程在 poll()调用时仍在运行,poll()方法就返回 None。如果该程序已经终止,它会返回该进程的整数退出代码。退出代码用于说明进程是无错终止(退出代码为 0),还是一个错误导致进程终止(退出代码非零,通常为 1,但可能根据程序而不同)。

wait()方法就像是等着你的朋友执行完她的代码,然后你继续执行你的代码。wait()方法将阻塞,直到启动的进程终止。如果你希望你的程序暂停,直到用户完成与其他程序,这非常有用。wait()的返回值是进程的整数退出代码。示例:

>>>calcProc = subprocess.Popen('c:\\Windows\\System32\\calc.exe')

>>>calcProc.poll()

0

>>>calcProc.wait()

0

1)  向 Popen()传递命令行参数

用 Popen()创建进程时,可以向进程传递命令行参数。要做到这一点,向 Popen()传递一个列表,作为唯一的参数。该列表中的第一个字符串是要启动的程序的可执行文件名,所有后续的字符串将是该程序启动时,传递给该程序的命令行参数。实际上,这个列表将作为被启动程序的 sys.argv 的值。示例:

>>>subprocess.Popen(['C:\\Windows\\notepad.exe', 'C:\\hello.txt'])

<subprocess.Popenobject at 0x00000000032DCEB8>

2)  Task Scheduler、launchd 和 cron

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值