Python標準庫之time, datetime包

2021-07-23 22:26:49 字數 3988 閱讀 6981

python具有良好的時間和日期管理功能。實際上,計算機只會維護乙個掛鐘時間(wall clock time),這個時間是從某個固定時間起點到現在的時間間隔。時間起點的選擇與計算機相關,但一台計算機的話,這一時間起點是固定的。其它的日期資訊都是從這一時間計算得到的。此外,計算機還可以測量cpu實際上執行的時間,也就是處理器時間(processor clock time),以測量計算機效能。當cpu處於閒置狀態時,處理器時間會暫停。

time包基於c語言的庫函式(library functions)。python的直譯器通常是用c編寫的,python的一些函式也會直接呼叫c語言的庫函式。

import time

print(time.time()) # wall clock time, unit: second

print(time.clock()) # processor clock time, unit: second

time.sleep()可以將程式置於休眠狀態,直到某時間間隔之後再喚醒程式,讓程式繼續執行。

import time

print('start')

time.sleep(10) # sleep for 10 seconds

print('wake up')

當我們需要定時地檢視程式執行狀態時,就可以利用該方法。

time包還定義了struct_time物件。該物件實際上是將掛鐘時間轉換為年、月、日、時、分、秒……等日期資訊,儲存在該物件的各個屬性中(tm_year, tm_mon, tm_mday...)。下面方法可以將掛鐘時間轉換為struct_time物件:

st = time.gmtime()      # 返回struct_time格式的utc時間

st = time.localtime() # 返回struct_time格式的當地時間, 當地時區根據系統環境決定。

s = time.mktime(st) # 將struct_time格式轉換成wall clock time

(1)、簡介

datetime包是基於time包的乙個高階包, 為我們提供了多一層的便利。

datetime可以理解為date和time兩個組成部分。date是指年月日構成的日期(相當於日曆),time是指時分秒微秒構成的一天24小時中的具體時間(相當於手錶)。你可以將這兩個分開管理(datetime.date類,datetime.time類),也可以將兩者合在一起(datetime.datetime類)。由於其構造大同小異,我們將只介紹datetime.datetime類。

比如說我現在看到的時間,是2023年9月3日21時30分,我們可以用如下方式表達:

import datetime

t = datetime.datetime(2012,9,3,21,30)

print(t)

所返回的t有如下屬性:

hour, minute, second, microsecond

year, month, day, weekday # weekday表示週幾

(2)、運算

datetime包還定義了時間間隔物件(timedelta)。乙個時間點(datetime)加上乙個時間間隔(timedelta)可以得到乙個新的時間點(datetime)。比如今天的上午3點加上5個小時得到今天的上午8點。同理,兩個時間點相減會得到乙個時間間隔。

import datetime

t = datetime.datetime(2012,9,3,21,30)

t_next = datetime.datetime(2012,9,5,23,30)

delta1 = datetime.timedelta(seconds = 600)

delta2 = datetime.timedelta(weeks = 3)

print(t + delta1)

print(t + delta2)

print(t_next - t)

在給datetime.timedelta傳遞引數(如上的seconds和weeks)的時候,還可以是days, hours, milliseconds, microseconds。

兩個datetime物件還可以進行比較。比如使用上面的t和t_next:

print(t > t_next)
(3)、datetime物件與字串轉換

假如我們有乙個的字串,我們如何將它轉換成為datetime物件呢?

乙個方法是用上一講的正規表示式來搜尋字串。但時間資訊實際上有很明顯的特徵,我們可以用格式化讀取的方式讀取時間資訊。

from datetime import datetime

format = "output-%y-%m-%d-%h%m%s.txt"

str = "output-1997-12-23-030000.txt"

t = datetime.strptime(str, format)

我們通過format來告知python我們的str字串中包含的日期的格式。在format中,%y表示年所出現的位置, %m表示月份所出現的位置……。

反過來,我們也可以呼叫datetime物件的strftime()方法,來將datetime物件轉換為特定格式的字串。比如上面所定義的t_next,

print(t_next.strftime(format))
具體的格式寫法可參閱官方文件。 如果是linux系統,也可查閱date命令的手冊($man date),兩者相通。

os.path包主要是處理路徑字串,比如說'/home/vamei/doc/file.txt',提取出有用資訊。

import os.path

path = '/home/vamei/doc/file.txt'

print(os.path.basename(path)) # 查詢路徑中包含的檔名

print(os.path.dirname(path)) # 查詢路徑中包含的目錄

info = os.path.split(path) # 將路徑分割成檔名和目錄兩個部分,放在乙個表中返回

path2 = os.path.join('/', 'home', 'vamei', 'doc', 'file1.txt') # 使用目錄名和檔名構成乙個路徑字串

p_list = [path, path2]

print(os.path.commonprefix(p_list)) # 查詢多個路徑的共同部分

此外,還有下面的方法:

os.path.normpath(path)   # 去除路徑path中的冗餘。比如'/home/vamei/../.'被轉化為'/home'
os.path還可以查詢檔案的相關資訊(metadata)。檔案的相關資訊不儲存在檔案內部,而是由作業系統維護的,關於檔案的一些資訊(比如檔案型別,大小,修改時間)。

import os.path 

path = '/home/vamei/doc/file.txt'

print(os.path.exists(path)) # 查詢檔案是否存在

print(os.path.getsize(path)) # 查詢檔案大小

print(os.path.getatime(path)) # 查詢檔案上一次讀取的時間

print(os.path.getmtime(path)) # 查詢檔案上一次修改的時間

print(os.path.isfile(path)) # 路徑是否指向常規檔案

print(os.path.isdir(path)) # 路徑是否指向目錄檔案

(實際上,這一部份類似於linux中的ls命令的某些功能)

Python標準庫之asyncio

asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。用asyncio實現hello wo...

Python 標準庫之 shutil

shutil是shell utilities的簡寫,它提供了大量的檔案和目錄的高階操作。特別針對檔案 目錄的拷貝和刪除,主要功能為目錄和檔案操作以及壓縮操作。函式說明 shutil.copyfile src,dst 從源src複製到dst中去。如果當前的dst已存在的話就會被覆蓋掉,src 和 ds...

python標準庫之glob

python標準庫之glob介紹 glob 檔名模式匹配,不用遍歷整個目錄判斷每個檔案是不是符合。1 萬用字元 星號 匹配零個或多個字元 import glob for name in glob.glob dir print name 複製 dir file.txt dir file1.txt di...