time、datetime和多線程

time模塊用於取得Unix紀元時間戳,並加以處理

import time
print(time.time())
print(round(time.time(),2))#四捨五入獲取當前時間

#超級秒錶
print('Press ENTER to begin.Afterwards, press ENTER to "click" the stopswatch.')
print('Press Ctrl-C to quit.')

input()
print('Started.')
startTime = time.time()
lastTime = startTime

lapNum = 1

try:
    while True:
        input()
        lapTime = round(time.time() - lastTime,2)
        totalTime = round(time.time() - startTime,2)
        print('Lap #%s: %s(%s)'%(lapNum,lapTime,totalTime),end ='')
        lapNum += 1
        lastTime = time.time()
except KeyboardInterrupt:
    print('\nDone')

如果更方便的格式顯示日期,或對日期進行算術運算,就應該使用datetime模塊

datetime模塊有自己的datetime數據類型,datetime值表示一個特定的時刻

import datetime

print(datetime.datetime.now())

dt = datetime.datetime.now()
print(dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second)#dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second(年、月、日、時、分、秒)

調用datetime.datetime.now()返回一個datetime對象,表示當前的日期和時間,這個對象包括當前時刻的年、月、日、時、分、秒、微妙

也可以利用datetime.datetime()函數,向它傳入代表年、月、日、時、分、秒整數,得到特定datetime對象

Unix紀元時間戳可以通過datetime.datetime.fromtimestamp(),轉化爲datetime對象,datetime對象的日期和時間將根據本地時區轉換

datetime對象可以通過比較操作符進行比較,弄清楚誰在前面,後面的datetime對象是更大值

print(datetime.datetime.fromtimestamp(time.time()))

if datetime.datetime(2017,12,21,12,12,12) >= datetime.datetime.fromtimestamp(time.time()):
    print("True")
else:
    print("False")


timedelta數據類型

datetime模塊還提供了timedelta數據類型,它表示一段時間,而不是一個時刻

要創建timedelta對象,就需要調用datetime.timedelta()函數,datetime.timedelta()函數接受關鍵字參數weeks、days、hours、minutes、seconds
、milliseconds和microseconds,沒有month和year關鍵詞參數,因爲“月”和“年”是可變的時間,依賴與特定的月份和年份。

timedelta對象用於的總時間以天、秒、毫秒來表示,這些數字分別保存在days、seconds和Microseconds屬性中,

timedelta對象調用total_seconds()方法返回只以秒錶示的時間,將一個timedelta對象傳入str()將返回格式良好的,人類可讀的字符串表示

delta = datetime.timedelta(weeks = 2,days = 2,hours = 12,minutes = 50,seconds = 45)

print(delta)
print(str(delta))

print(delta.days,delta.seconds,delta.microseconds)

print(delta.total_seconds())
算術運算符可以用於對datetime值進行日期運算

利用+/-運算符,timedetla對象與datetime對象或者其他timedetla對象相加減;
利用*和/運算符,timedetla對象可以乘以或者除以整數或者浮點數

dtt = datetime.datetime.now() + delta

print(dtt)

print(datetime.datetime.now() - delta)

print(delta*2)
print(delta*2.14)

print(delta/2)
print(delta/2.14)


暫停直至特定時間

startRunTime = datetime.datetime(2017,6,22,14,36,0)
while datetime.datetime.now() < startRunTime:
    time.sleep(1)
print("startRunTime......")

將datetime對象轉變爲字符串
利用strftime()方法,可以將datetime對象顯示成字符串,向strftime()傳入一個定製的格式字符串,其中包含格式化指定(以及任何需要的斜線
、冒號等),strftime()將返回一個格式化的字符串

完整的strftime()指令:
下面是詳細參數:
t:這是要格式化秒的時間。
format:這是將用於格式化給定的時間指令。以下指令可以嵌入在格式字符串。

指令:
%a - 星期幾的簡寫名稱
%A - 星期名全稱
%b - 月份名稱縮寫(英文)
%B - 完整的月份名稱(英文)
%c - 首選的日期和時間的表示
%C - 世紀值(除以100年,範圍從00到99)
%d - 月份中的一天(01至31日)
%D - 和%m /%d /%y相同
%e - (1到31月的一天)
%g - %G一樣,但沒有世紀,年份
%G - 4位數的年份對應的ISO星期數(參見%的V)。
%H - 小時,使用24小時時鐘(00至23)
%h - 等同與%b
%I - 小時,使用12小時時鐘(01到12)
%j - 一天的一年(001到366)
%m - 月份(01到12)
%M - 分鐘
%n - 換行符
%p - 無論是上午或下午,根據給定的時間價值
%r - 時間在上午和下午符號
%R - 24小時符號的時間,不含有秒
%S - 秒(00-59)
%t - 製表符
%T - 當前時間,和%H:%M:%S的
%U - 等同於%V和%W
%u - 平日作爲一個數字(1至7),星期一= 1。警告:在Sun公司的Solaris星期日=1
%V - 本年度ISO 8601的週數(01至53),其中第1周是在本年度至少4天的第一個星期,星期一作爲一週的第一天
%W - 當年的週數,第一週的第一天開始的第一個星期一
%w - 星期作爲一個小數,星期日= 0 %X - 首選日表示,沒有時間
%x - 首選的時間表示沒有日期,"06/22/17"
%y - 沒有世紀的年份(範圍從00到99)
%Y - 包括世紀的一年 %Z或%Z - 時區名或縮寫
%% - 文字上的字符%
'''

#datetime.datetime.now()可以被替換爲datetime.datetime(2015,6,18,13,25,34)
print(datetime.datetime.now().strftime('%Y/%m/%d %I:%M:%S %R'))
print(datetime.datetime.now().strftime('%Y/%m/%d %I:%M:%S %p'))

print(datetime.datetime.now().strftime('%Y/%m/%d %R'))

print(datetime.datetime.now().strftime('%V'))
print(datetime.datetime.now().strftime('%W'))
print(datetime.datetime.now().strftime('%h'))
print(datetime.datetime.now().strftime('%T'))

print(datetime.datetime.now().strftime('%x'))

將字符串轉換成datetime對象

需要愛調用datetime.datetime.strptime(),striptime()函數和strftime()函數相反,定製的格式字符串使用相同的指定,
必須將格式字符串傳入strptime(),這樣它就知道如何解析和理解字符串

print(datetime.datetime.strptime('2017/06/22 07:16:14 PM','%Y/%m/%d %I:%M:%S %p'))

多線程

使用threading模塊,在單獨的線程中執行延遲或安排其他代碼,這個單獨的進程將因爲time.sleep()調用而暫停,同時,程序可以在原來的線程中做其他工作

要得到單獨的線程,首先要調用threading.Thread()函數,生成一個Thread對象

import threading

print('Starting of program.')


def takeANap():
    time.sleep(5)
    print('Wake up!')

threadObj = threading.Thread(target = takeANap)#調用threading.Thread()函數,並傳入關鍵字參數target=takeANap,而不是target=takeANap(),創建threadObj對象
threadObj.start()#創建新的線程,並開始在新的線程中執行目標函數

print('End of program.')

向線程的目標函數傳遞參數

如果想在新線程中運行的目標函數有參數,可以將目標函數的參數傳入threading.Thread()函數

print('Cats','Dags','Frogs',sep = ' & ')
threadObjOne = threading.Thread(target = print,args = ['Cats','Dags','Frogs'],kwargs = {'sep':' & '})
threadObjOne.start()

從python啓動其他程序

利用內建的subprocess模塊中的Popen()函數,Python程序可以啓動計算機中的其他程序

Popen()函數中的P代表Process進程,參數是程序的文件路徑,返回值是Popen對象

每一個進程可以有多個線程,不像線程,進程無法讀取另一個進程的變量

import subprocess
subprocess.Popen('C:\\Users\\Nick\\AppData\\Roaming\\360se6\\Application\\360se.exe')
#返回值是一個Popen對象,<subprocess.Popen object at 0x02C007B0>

Popen 對象有兩個非常有用的函數poll()和wait()

poll()是查看進程是否正在運行;如果進程在poll()方法調用時正在運行,poll()返回None,如果該進程以停止運行,他就會返回程序的整數退出代碼,

退出代碼用於說明進程無錯誤終止(退出代碼爲0),還是一個錯誤導致進程終止(退出代碼非零,通常爲1)


wait()方法就像是等待你的朋友執行完他的代碼,然後在執行你的代碼

wait()方法將阻塞,直到啓動的進程終止,如果你希望你的程序暫停,直到用戶完成其他程序
wait()的返回值是進程的整數退出代碼

import subprocess
sunprocessObj = subprocess.Popen('C:\\Users\\Nick\\AppData\\Roaming\\360se6\\Application\\360se.exe')
print(sunprocessObj.poll())
print(sunprocessObj.wait())
time.sleep(5)
print(sunprocessObj.poll())

Popen()函數創建進程時,可以向進程傳遞命令行參數,要做到這一點,向Popen()傳遞一個列表,作爲唯一參數,列表的第一字符串是要啓動的程序的可執行文件名,
後續的字符串將是程序啓動時,傳遞給該程序的命令行參數
subprocess.Popen(['C:\\Program Files (x86)\\Sublime Text3\\sublime_text.exe','C:\\Users\\Nick\\Desktop\\solr方法.txt'])

使用默認的應用程序打開文件

每一個操作系統中,都有一個程序,其行爲等價於雙擊文檔文件打開它,

在windows,這就是start程序;在OSX中,這就是open程序;在Ubuntu Linux上,這就是see程序

subprocess.Popen(['start','C:\\Users\\Nick\\Desktop\\solr方法.txt'],shell=True)

#倒計時
timeLeft = 60

while timeLeft > 0:
    print(timeLeft,end = ' ')
    time.sleep(1)
    timeLeft = timeLeft - 1
subprocess.Popen(['start','C:\\Users\\Nick\\Desktop\\感覺靜謐.mp3'],shell=True)




發佈了32 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章