python day 7 2019/10/10 學習資料來自老男孩教育 [TOC] 1. time模塊 若要使用python的time模塊,需要先導入time. 電腦有兩種標準時間,一種是基於世界時間的時間戳(即給定日期距1970年1月1日的秒數),另外一種是struct_time對象的9個數字的 ...
目錄
python day 7
2019/10/10
學習資料來自老男孩教育
1. time模塊
若要使用python的time模塊,需要先導入time.
電腦有兩種標準時間,一種是基於世界時間的時間戳(即給定日期距1970年1月1日的秒數),另外一種是struct_time對象的9個數字的元組。
該元組的元素是以下9部分:
year (包括世紀,比如2001)
month (1-12)
day (1-31)
hours (0-23)
minutes (0-59)
seconds (0-59)
weekday (0-6,Monday is 0)
Julian day (給定時間在該年的天數,1-366)
DST (daylight savings time夏令時) flags(-1,0 or 1)
如果flags是0,則時間是標準時區時間。
如果flags是1,則時間是夏令時時間。
如果是-1,則mktime()方法得到的時間是基於日期和時間來定的。
time模塊有一個類叫做struct_time,創建實例時,需要接收9個數字來做作為屬性。
import time
# print(time.time()) #返回自1970年1月1日的時間戳
# print('start to sleep...')
# time.sleep(5) #讓程式休眠5秒
time.time() #輸出當前時間戳
#1570612780.9513557
time.localtime(time.time()) #將時間戳轉換為本地時間的時間元組,若不傳參數,則預設為當前時間戳。
#time.struct_time(tm_year=2019, tm_mon=10, tm_mday=9, tm_hour=17, tm_min=21, tm_sec=19, tm_wday=2, tm_yday=282, tm_isdst=0)
time.asctime(time.localtime()) #將時間元組轉換為字元串,如果不傳參數,則預設是localtime()返回的時間元組。
#'Wed Oct 9 17:36:30 2019'
time.ctime(time.time()) #將時間戳轉換為本地時間的字元串,如果不傳參數,則預設是當前時間戳。
#'Wed Oct 9 17:38:43 2019'
time.gmtime(782142314) #將時間戳轉換為世界時間的時間元組。世界時間就是格林威治時間(GMT).不傳參數則預設是當前時間戳。
#time.struct_time(tm_year=1994, tm_mon=10, tm_mday=14, tm_hour=13, tm_min=45, tm_sec=14, tm_wday=4, tm_yday=287, tm_isdst=0)
time.mktime(time.localtime()) #將時間元組轉換成時間戳
#1570614304.0
time.sleep(1) #讓程式休眠多少秒。
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #將時間元組按照指定格式轉換成為字元串。
#'2019-10-09 17:51:13'
time.strptime('2019-10-09 17:51:13','%Y-%m-%d %H:%M:%S') #將字元串按照指定格式轉換為時間元組。
#time.struct_time(tm_year=2019, tm_mon=10, tm_mday=9, tm_hour=17, tm_min=51, tm_sec=13, tm_wday=2, tm_yday=282, tm_isdst=-1)
2. datetime模塊
datetime模塊相比time模塊提供了更多功能,主要有五個類,date(日期),time(時間),datetime(日期時間),timedelta(時間差),tzinfo(時區信息)。
2.1 date類
datetime.date(year,month,day)
- 類方法和類屬性
from datetime import *
import time
print(date.max) # 這是date類的類屬性max,即一個date類能夠表示的最大日期,是9999-12-31。
print(date.min) # 這是date類的類屬性min,即一個date類能夠表示的最小日期,是0001-01-01。
print(date.fromtimestamp(1214123413)) #這是date類的類方法,將時間戳轉換成年月日格式的字元串
2008-06-22 <class 'datetime.date'>
print(date.today()) #這是date類的類方法today,調用了類的fromtimestamp,輸出當前年月日。
2019-10-09
- 對象方法和對象屬性
from datetime import *
import time
print(date.max) # 這是date類的類屬性max,即一個date類能夠表示的最大日期,是9999-12-31。
print(date.min) # 這是date類的類屬性min,即一個date類能夠表示的最小日期,是0001-01-01。
print(date.fromtimestamp(1214123413)) #這是date類的類方法,將時間戳轉換成年月日格式的字元串
print(date.today()) #這是date類的類方法today,調用了類的fromtimestamp,輸出當前年月日。
d1 = date(2019,10,9) #創建一個date實例(由類創建的一個對象叫類的一個實例,也可以叫date對象),實例的屬性年,月,日必須是整數。
print(d1.year) #這是date實例d1的實例屬性year,獲得第一個參數2018
print(d1.month) #這是date實例d1的實例屬性month,獲得第二個參數9
print(d1.day) #這是date實例d1的實例屬性day,獲得第三個參數2
print(d1.ctime()) #實例d1的對象方法,返回一個本地時間的字元串,Sun Sep 2 00:00:00 2018
print(d1.replace(year=2019,month=9,day=11)) #生成一個新的date對象(實例),用指定的年,月,日替換原有對象中的屬性。(原對象仍保持不變)
print(d1.timetuple())#返回日期對應的time.struct_time對象。
print(d1.weekday()) #返回weekday,如果是星期一,返回1,如果是星期天,返回0,依此類推
print(d1.isoweekday()) #返回基於ISO標準的星期數對應的數值,如果是星期一,返回1,如果是星期天,返回7,依此類推
print(d1.isocalendar()) #返回基於ISO時間的日曆的元組。(2019, 41, 3)
print(d1.isoformat(),type(d1.isoformat())) #返回基於ISO標準的字元串,即格式如'YYYY-MM-DD'的字元串
print(d1.strftime('%Y/%m/%d'),type(d1.strftime('%Y/%m/%d'))) #返回指定格式的字元串。
9999-12-31
0001-01-01
2008-06-22
2019-10-09
2019
10
9
Wed Oct 9 00:00:00 2019
2019-09-11
time.struct_time(tm_year=2019, tm_mon=10, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=282, tm_isdst=-1)
2
3
(2019, 41, 3)
2019-10-09 <class 'str'>
2019/10/09 <class 'str'>
2.2 time類
datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
- 類方法和類屬性
print(time.min) #這是datetime模塊裡面time類的類屬性min,表示能表示的最小時間。
print(time.max) #這是datetime模塊裡面time類的類屬性max,表示能表示的最大時間。
print(time.resolution) #類屬性,是1微秒。
print(time.fromisoformat('21:20:53')) #類方法,將字元串轉換成基於ISO標準指定格式的時間
00:00:00
23:59:59.999999
0:00:00.000001
21:20:53
- time對象的方法和屬性
t1 = time(21,33,20,55) #創建一個time對象t1,即21:33:33.55
print(t1.hour,t1.minute,t1.second,t1.microsecond) #time對象t1具有多個對象屬性
t2 = t1.replace(hour=22,minute=22) #將其屬性用指定參數進行替換,並返回一個新的time對象。
print(t1.isoformat()) #返回形如'HH:MM:SS'格式的字元串
print(t1.strftime('%H/%M/%S')) #返回指定格式的字元串
21 33 20 55
21:33:20.000055
21/33/20
2.3 datetime類
datetime繼承自date類。datetime相當於date和time類的結合。
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),year,month,day,是必輸參數,其他都是可選參數。
- 類方法和類屬性
print(datetime.today()) #類方法,返回一個表示當前本地時間的datetime對象
print(datetime.now()) #類方法,返回一個表示當前本地時間的datetime對象,如果有參數tz,則獲取tz參數所指時區的本地時間。
print(datetime.utcnow()) #類方法,返回一個當前utc時間的datetime對象。就是格林威治時間。
print(datetime.fromtimestamp(13421341324)) #類方法,根據時間戳創建一個datetime對象,如果有參數tz,則返回tz所指時區的本地時間。
print(datetime.utcfromtimestamp(134213)) #類方法,根據時間戳創建一個utc時間的datctime對象。
print(datetime.combine(date(2019,10,8),time(11,30,31))) #類方法,根據date對象和time對象創建一個datetime對象。
print(datetime.strptime('2019-10-01 21:33:22','%Y-%m-%d %H:%M:%S')) # 類方法,將格式字元串轉換為datetime對象
2019-10-09 21:30:41.375334
2019-10-09 21:30:41.375333
2019-10-09 13:30:41.375333
2395-04-22 22:22:04
1970-01-02 13:16:53
2019-10-08 11:30:31
2019-10-01 21:33:22
- 對象方法和屬性
from datetime import *
dt1 = datetime(2019,10,2,12,36,33) #只有年,月,日參數是必輸的。創建一個datetime對象。
print(dt1.year,dt1.month,dt1.day,dt1.hour,dt1.minute,dt1.second,dt1.microsecond,dt1.tzinfo) # 對象屬性
print(dt1.date(),type(dt1.date())) #對象方法,獲取date對象
print(dt1.time(),type(dt1.time())) #對象方法,獲取time對象
print(dt1.replace(year = 2018)) #將指定參數進行替換,並返回一個新的datetime對象
print(dt1.timetuple()) #返回本地時間的time.struct_time對象,即時間元組。
print(dt1.utctimetuple()) #返回utc時間的時間元組
print(dt1.toordinal()) #返回當前日期距西曆1年1月1日的天數
print(dt1.weekday()) #返回今天是星期幾,用數字代替星期幾,0是星期天,1是星期一,依此類推
print(dt1.isoweekday()) #返回今天是星期幾,用數字代替星期幾,7是星期天,1是星期一,依此類推
print(dt1.isocalendar()) #返回以元組形式的(年,月,日)
2019 10 2 12 36 33 0 None
2019-10-02 <class 'datetime.date'>
12:36:33 <class 'datetime.time'>
2018-10-02 12:36:33
time.struct_time(tm_year=2019, tm_mon=10, tm_mday=2, tm_hour=12, tm_min=36, tm_sec=33, tm_wday=2, tm_yday=275, tm_isdst=-1
)
time.struct_time(tm_year=2019, tm_mon=10, tm_mday=2, tm_hour=12, tm_min=36, tm_sec=33, tm_wday=2, tm_yday=275, tm_isdst=0)
737334
2
3
(2019, 40, 3)
2.4 timedelta類
timedelta類是datetime對象加減的類。
使用timedelta可以很方便的在日期上做天days,小時hour,分鐘,秒,毫秒,微妙的時間計算,如果要計算月份則需要另外的辦法。
dt2 = datetime.now() #創建一個本地當前時間的datetime對象
dt3 = dt2 + timedelta(days=1) #明天
dt4 = dt2 + timedelta(days=-1) #昨天
delta_obj = dt3 - dt2 #獲得一個timedelta對象
print(dt2,dt3,sep='\t')
print(type(delta_obj),delta_obj,delta_obj.days,delta_obj.total_seconds(),sep='\n')
#timedelta對象有days, seconds, microseconds,milliseconds, minutes, hours, weeks等屬性,total_seconds()方法。
2019-10-09 22:04:11.841300 2019-10-10 22:04:11.841300
<class 'datetime.timedelta'>
1 day, 0:00:00
1
86400.0
2.5 tzinfo時區類
tzinfo是一個關於時區信息的抽象基類,不能直接實例化,必須創建一個子類。
tzinfo的子類必須重載tzname(), utcoffset() and dst()方法.
from datetime import *
class UTC(tzinfo): #UTC類繼承自tzinfo類
"""UTC"""
def __init__(self,offset = 0): #構造函數__init__,預設UTC對象的offset屬性,即時區基準點是0
self._offset = offset
def utcoffset(self, dt):
return timedelta(hours=self._offset)
def tzname(self, dt): #定義UTC對象的獲取時區名字方法,參數是一個datetime對象
return "UTC +%s" % self._offset
def dst(self, dt): #
return timedelta(hours=self._offset)
# 北京時間
bj_time = datetime(2019, 10, 9, 22, 24, 23, tzinfo=UTC(8)) # 設置時區,tzinfo形參是一個UTC對象
# 曼谷時間
bangkok = datetime(2019, 10, 9, 22, 24, 23, tzinfo=UTC(7))
print(bj_time,bangkok,sep='\n')
# 將北京時間轉換成曼谷時間
print(bj_time.astimezone(tz=UTC(7)))
#計算時差
timecha = bj_time - bangkok
print(timecha,type(timecha))
2019-10-09 22:24:23+08:00
2019-10-09 22:24:23+07:00
2019-10-09 21:24:23+07:00
-1 day, 23:00:00 <class 'datetime.timedelta'>
ps:完全記不住,只能先放在這兒,用時再看了。只記住time.time(),time.sleep(),datetime.now(),datetime.today(). 至於strftime(),strptime(),只知道要接兩個參數,一個是格式化在前,另外一個是時間元組對象。
3. sys模塊
sys模塊是python內置模塊,存儲模塊搜索路徑,命令行參數,以及一些底層功能等的模塊。
import sys
#sys模塊的argv變數,是一個列表,元素是當前腳本在命令行模式下的傳入參數,
# 比如在命令行模式下輸入:python sysmodule.py 1 2 3
print(sys.argv)
#輸出結果為['sysmodule.py', '1', '2', '3'],第一個元素是程式本身路徑
print(sys.path) # 返回模塊的搜索路徑列表,初始化時使用PYTHONPATH環境變數的值。如果要導入一個模塊,必須在sys.path列表中有這個程式的路徑。
#
print(sys.version) #程式的版本號
print(sys.int_info) #系統的整數信息
print(sys.platform) #判斷系統是哪個系統,windows系統是win32,linux系統是linux
print(sys.stdout) #<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> 相當於寫模式打開了一個文件流對象
print(sys.stdin) #<_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>,相當於讀模式打開了一個文件流對象
sys.stdout.write('hello') #stdin , stdout , 以及stderr 變數包含與標準I/O 流對應的流對象,stdin,stdout,stderr在Python中都是文件屬性對象,文件具有write等寫入方法
ret = sys.stdin.readline()[:-1] #讀取用戶輸入的內容。
print(ret)
sys.exit(0) #退出程式,正常退出時是exit(0)
#在命令行模式中顯示進度條
for i in range(21):
sys.stdout.write('\r') #每次都清空原行
sys.stdout.write('*%s%% |%s'%(int(i/20*100),int(i/30*100)*'*'))
sys.stdout.flush() #強制刷新到屏幕
time.sleep(0.1)
4.pickle序列化模塊與json序列化模塊
將一個對象轉換成bytes類型的過程叫序列化,將bytes對象轉換成為原對象的過程叫反序列化。pickle只支持python的數據類型,而json在其他語言中也可以使用。
import pickle
with open('../day7_time_os_sys/account.db','rb+') as f:
ret = pickle.load(f) #load方法接收一個文件對象作為參數,將文件中的數據轉換為原來的對象類型。這叫做對象的反序列化。
ret[1000]['balance'] += 10000
pickle.dump(ret,f) # dump方法接收一個對象和文件流對象作為參數,將該對象轉換為位元組對象,並將位元組對象寫入文件,會將原文件覆蓋掉
print(f.tell())
f.seek(0)
data = f.read()
ret2 = pickle.loads(data) #loads方法接收bytes位元組對象作為參數,並將位元組轉換為原來的對象
ret2[1001]['balance'] +=1000
data2 = pickle.dumps(ret2) #dumps方法接收任意對象作為參數,並將其轉換為bytes位元組對象,這叫做對象的序列化。
f.write(data2)
json的用法與pickle一樣,只是更適合不同編程語言類型之間通信,且loads方法返回的對象類型中的元素不太一樣。
```python
import json
accounts ={
1000:{
'name':'John',
'email':'[email protected]',
'passwd':'abc123',
'balance':15000,
'phone':13641280280,
'bank_acc':{
'ICBC':14324234,
'CBC':23523213,
'ABC':34267898
}
},
1001:{
'name':'Lucy',
'email':'[email protected]',
'passwd':'abc456',
'balance':-15000,
'phone':13641287898,
'bank_acc':{
'ICBC':1231412,
'CBC':212343213,
'ABC':34137898
}
}
}
with open('account.txt','wb+') as f:
data = json.dumps(accounts) #json的dumps方法接收一個對象作為參數,將該對象序列化成str類型
print(data,type(data))
#因為data是str字元串類型,而打開模式是wb,所以需要將data轉換成為bytes類型。
f.write(bytes(data,encoding='utf-8'))
f.flush()
f.seek(0)
data2 = f.read()
data3 = json.loads(str(data2,encoding='utf-8')) #json的loads方法接收一個str對象作為參數,並將其反序列化原對象,該對象的元素的key都將變成字元串類型。
print(data3,type(data3))
'''
‘{"1000": {"name": "John", "email": "[email protected]", "passwd": "abc123", "balance": 15000, "phone": 13641280280, "bank_acc": {"ICBC": 14324234, "CBC": 23523213, "ABC": 34267898}}, "1001": {"name": "Lucy", "email": "[email protected]", "passwd": "abc456", "balance": -15000, "phone": 13641287898, "bank_acc": {"ICBC": 1231412, "CBC": 212343213, "ABC": 34137898}}}’ <class 'str'>
{'1000': {'name': 'John', 'email': '[email protected]', 'passwd': 'abc123', 'balance': 15000, 'phone': 13641280280, 'bank_acc': {'ICBC': 14324234, 'CBC': 23523213, 'ABC': 34267898}}, '1001': {'name': 'Lucy', 'email': '[email protected]', 'passwd': 'abc456', 'balance': -15000, 'phone': 13641287898, 'bank_acc': {'ICBC': 1231412, 'CBC': 212343213, 'ABC': 34137898}}} <class 'dict'>
'''