python day7: time,datetime,sys,pickle模塊

来源:https://www.cnblogs.com/lanxing0422/archive/2019/10/11/pythonday7.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ELK Elasticsearch Logstash Kibana ...
  • 前言 今天我們一起看看行為模式中的迭代器模式,迭代是重覆反饋過程的活動,其目的通常是為了接近併到達所需的目標或結果。在系統開發中簡單說可以理解成遍歷。這種模式用於順序訪問集合對象的元素,不需要知道集合對象的底層或者內部表示。 迭代器模式介紹 一、來由 在系統開發中,集合對象內部表示各不相同。底層構造 ...
  • 前言 在之前的 "設計模式 單例模式(詳解)看看和你理解的是否一樣?" 一文中,我們提到了通過 開發工具進行多線程調試、單例模式的暴力破壞的問題;由於篇幅原因,現在單獨開一篇文章進行演示:線程不安全的單例在多線程情況下為何被創建多個、如何破壞單例。 如果還不知道如何使用IDEA工具進行線程模式的調試 ...
  • 訪問者模式(Vistor): 訪問者模式的官方定義是這樣的:表示一個作用於某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。官方的東西總是晦澀難懂的,那麼我們現在就來拆解一下:首先"一個作用於某對象結構中的各元素的操作",提到了三個東西:對象結構、元素、操作。 ...
  • Java中使用SimpleDateFormat 進行日期格式化類 SimpleDateFormat 日期格式化類 示例 1 : 日期轉字元串 y 代表年 M 代表月 d 代表日 H 代表24進位的小時 h 代表12進位的小時 m 代表分鐘 s 代表秒 S 代表毫秒 package date; imp ...
  • 前言 在SpringCache緩存初探中我們研究瞭如何利用spring cache已有的幾種實現快速地滿足我們對於緩存的需求。這一次我們有了新的更個性化的需求,想在一個請求的生命周期里實現緩存。 需求背景是:一次數據的組裝需要調用多個方法,然而在這多個方法里又會調用同一個IO介面,此時多浪費了一次I ...
  • 一、mybatis歷史: 額,學習一門新事物時瞭解一下它的歷史能在腦中形成一個大致的輪廓...進入正題... mybatis以前叫做ibatis,ibatis是Apache旗下的產品,在2010年時google將其接管並更名為mybatis。(你可以發現它的包結構還是org.apache.ibati ...
  • 一、封裝的步驟 (1)所有屬性私有化,使用private關鍵字進行修飾,private表示私有的,修飾的所有數據只能在本類中進行訪問。 (2)對外提供簡單的操作入口,也就是說以後外部程式要想訪問age屬性的話,必須通過這些簡單的入口才能進行訪問。 i.對外提供兩個公開的方法,分別是set方法和get ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...