8狼牺、序列操作羡儿、time模塊

Lesson_8


【8】對序列的文件操作:泡菜(pickle)

文件的寫入只能寫入普通的字符,對于list是钥、tuple掠归、dict、set這些類型無法寫入悄泥,所以只能使用二進(jìn)制寫入虏冻,但是‘wb’使用了以后一直在報(bào)錯(cuò)TypeError: write() argument must be str, not tuple

那怎么辦:

python給我們提供了pickle模塊,它幾乎可以把所有python的對象轉(zhuǎn)化為二進(jìn)制的形式存放,這個(gè)過程稱為picking弹囚,那么二進(jìn)制轉(zhuǎn)換為對象就是unpicking.

python的pickle模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列和反序列化厨相。通過pickle模塊的序列化操作我們能夠?qū)⒊绦蛑羞\(yùn)行的對象信息保存到文件中去,永久存儲鸥鹉;通過pickle模塊的反序列化操作蛮穿,我們能夠從文件中創(chuàng)建上一次程序保存的對象。

基本接口:

pickle.dump(obj, file, [,protocol])

注解:將對象obj保存到文件file中去毁渗。

protocol為序列化使用的協(xié)議版本绪撵,0:ASCII協(xié)議,所序列化的對象使用可打印的ASCII碼表示祝蝠;1:老式的二進(jìn)制協(xié)議音诈;2:2.3版本引入的新二進(jìn)制協(xié)議幻碱,較以前的更高效。其中協(xié)議0和1兼容老版本的python细溅。protocol默認(rèn)值為0褥傍。

file:對象保存到的類文件對象。file必須有write()接口喇聊, file可以是一個(gè)以'w'方式打開的文件或者一個(gè)StringIO對象或者其他任何實(shí)現(xiàn)write()接口的對象恍风。如果protocol>=1,文件對象需要是二進(jìn)制模式打開的誓篱。

pickle.load(file)

注解:從file中讀取一個(gè)字符串朋贬,并將它重構(gòu)為原來的python對象。

file:類文件對象窜骄,有read()和readline()接口锦募。


import pickle   #引入數(shù)據(jù)持久性模塊

myList = (1,2,3,4,5,"sunck is a good man")
path = r"C:\Users\xlg\Desktop\Python-1704\day08\1-文件讀寫\file6.txt"
f = open(path, "wb")
pickle.dump(myList, f)
f.close()


#讀取
f1 = open(path, "rb")
tempList= pickle.load(f1)
print(tempList)
f1.close()

【9】編碼和解碼

如果中文字符在寫入文件的時(shí)候沒有設(shè)置utf-8或者gbkgb2312等中文字符集邻遏,那么讀取的時(shí)候就是2進(jìn)制的糠亩。

path = 'wdemo.txt'

with open(path, "wb") as f1:
    str = "你好上海,你好千鋒"
    f1.write(str.encode("utf-8")) 

with open(path, "rb") as f2:
    data = f2.read()
    print(data)
    print(type(data))
    newData = data.decode("utf-8")
    print(newData)
    print(type(newData))

【10】文件系統(tǒng)(os模塊)

接下來我們講一個(gè)Python里面十分有用的模塊准验,什么是模塊赎线?其實(shí)我們每一個(gè).py的文件都是一個(gè)模塊。python自身帶有非常多使用的模塊糊饱,在日常編程中垂寥,如果能夠熟練地掌握它們,將事半功倍另锋。

首先要介紹的高大上的OS模塊撬统,OS就是Operating System的縮寫蚪缀,意思是操作系統(tǒng)纳猫。很多的文件系統(tǒng)的訪問都是通過OS模塊來實(shí)現(xiàn)的虱岂。我們所知道的windows、Mac OS台舱、UNIX律杠、Linux等,對于這些系統(tǒng)的底層實(shí)現(xiàn)起來也是不一樣的,因此你就需要考慮用到哪個(gè)模塊了竞惋。

但是python是跨平臺的語言柜去,也就是說,同樣的源碼在不同的操作系統(tǒng)不需要修改同樣可以實(shí)現(xiàn)拆宛。有了OS模塊嗓奢,不需要關(guān)心什么操作系統(tǒng)下使用什么模塊,OS會幫你選擇正確的模塊并調(diào)用浑厚。

函數(shù)名 使用方法
os.getcwd() 獲得當(dāng)前工作目錄
os.curdir 返回當(dāng)前目錄('.')
os.environ 獲取當(dāng)前環(huán)境變量
os.environ.get(path) 獲取指定的環(huán)境變量
os.listdir(path): 列出dirname下的目錄和文件
os.mkdir(path): 創(chuàng)建單層目錄股耽,如果目錄已經(jīng)存在拋出異常
os.makedirs(.path) 遞歸創(chuàng)建多級目錄根盒,如果目錄已經(jīng)存在拋出異常(E:\a\b和E:\a\c不會沖突)
os.remove(path) 刪除文件
os.rmdir(path) 刪除單層目錄,如果目錄非空則拋出異常
os.removedirs(path) 遞歸刪除目錄物蝙,從子目錄到父目錄逐個(gè)刪除炎滞,遇到目錄非空則拋出異常
os.rename(new,old) 將文件的old重命名為new
os.system(command) 運(yùn)行系統(tǒng)的shell命令
以下是: 支持路徑操作中常用到的一些定義支持所有平臺
os.curdir 指代當(dāng)前目錄('.')
os.pardir 指代上一級目錄('..')
os.sep 輸出操作系統(tǒng)特定的路徑分隔符(windons下是\,linux下是/)
os.linesp 當(dāng)前平臺使用的終止符((windons下是\r\n诬乞,linux下是\n)
os.name 指定當(dāng)前的操作系統(tǒng)(包括'posix','nt','mac','os2','ce','java')

1.getcwd()

得當(dāng)前工作目錄

import os
print(os.getcwd())

#C:\\Python36

2.chdir()

改變工作目錄

import os
os.chdir('C:\\Python27')
print(os.getcwd())

#C:\\Python27

3册赛、system()

運(yùn)行系統(tǒng)命令


import os
os.system('clear')  #清理命令行屏幕上的所有過去輸入的信息

4、walk()

非常有用的函數(shù)震嫉,可以用來指定遍歷指定路徑下的所有子目錄森瘪,并返回一個(gè)三元祖的結(jié)果:


import os

for i in os.walk('/Users/ruidong/www'):
    print(i)

5.os.path模塊

這是另一個(gè)強(qiáng)大的模塊,它可以完成一些路徑操作票堵。

函數(shù)名 使用方法
os.path.abspath(path) #返回絕對路徑
os.path.basename(path) #返回文件名
os.path.dirname(path) #返回文件路徑
os.path.join(path1[, path2[, ...]]) #把目錄和文件名合成一個(gè)路徑
os.path.split(path) #把路徑分割成dirname和basename扼睬,返回一個(gè)元組
os.path.splitext(path) #分割路徑,返回路徑名和文件擴(kuò)展名的元組
os.path.getsize(path) #返回文件大小换衬,如果文件不存在就返回錯(cuò)誤
os.path.getatime(path) #返回最后一次訪問的時(shí)間痰驱。
os.path.getctime(path) #返回文件的創(chuàng)建時(shí)間
os.path.getmtime(path) #返回在此path下最后一次修改的時(shí)間证芭。
以下函數(shù)返回的是 True或False
os.path.exists(path) #路徑存在則返回True,否則回False
os.path.samefile(path1, path2) #判斷兩個(gè)變量是不是指向同一個(gè)文件
os.path.isabs(path) #判斷指定路徑是否是絕對路徑
os.path.isdir(path) #判斷指定路徑是否存在且是個(gè)目錄
os.path.isfile(path) #判斷指定路徑是否存在且是個(gè)文件
os.path.islink(path) #判斷指定路徑是否存在且是一個(gè)符號鏈接
os.path.ismount(path) #判斷指定目錄是否存在且是個(gè)掛載點(diǎn)
os.path.join()

這里的join和BIF里面的join不是一回事瞳浦,它是將路徑名和文件名組合成一個(gè)完整的路徑。

import os

_path = r'/Users/ruidong/www'

_file = r'demo.txt'

final_path = os.path.join(_path,_file)

print(final_path)


#/Users/ruidong/www/demo.txt

split()和splitext()

split()和splitext()函數(shù)都用于分割路勁废士,split()函數(shù)分割路徑和文件名叫潦,而splitext()用于分割文件名和后綴名。

import os

_path = r'/Users/ruidong/www/demo.txt'

print(os.path.split(_path))
print(os.path.splitext(_path))

#('/Users/ruidong/www', 'demo.txt')
#('/Users/ruidong/www/demo', '.txt')

【11】棧和隊(duì)列

collections是Python內(nèi)建的一個(gè)集合模塊官硝,提供了許多有用的集合類矗蕊。

使用list存儲數(shù)據(jù)時(shí),按索引訪問元素很快氢架,但是插入和刪除元素就很慢了傻咖,因?yàn)閘ist是線性存儲,數(shù)據(jù)量大的時(shí)候岖研,插入和刪除效率很低卿操。

deque是為了高效實(shí)現(xiàn)插入和刪除操作的雙向列表,適合用于隊(duì)列和棧:

棧(stack)又名堆棧孙援,它是一種運(yùn)算受限的線性表害淤。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算。這一端被稱為棧頂拓售,相對地窥摄,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧础淤、入椪阜牛或壓棧哨苛,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素币砂;從一個(gè)棧刪除元素又稱作出椧乒或退棧,它是把棧頂元素刪除掉道伟,使其相鄰的元素成為新的棧頂元素迹缀。

棧的原則就是先進(jìn)后出

<image src='images/stack.jpg' />

我們用一個(gè)列表來模擬壓棧:

我們列表的最后一個(gè)元素就是棧頂

第一個(gè)元素就是棧底

#用隊(duì)列集合模擬棧運(yùn)行
import collections
#創(chuàng)建一個(gè)隊(duì)列 ,用于模擬棧的運(yùn)行
queue = collections.deque()
print(queue)

#進(jìn)棧(存數(shù)據(jù))
queue.append("A")
print(queue)
queue.append("B")
print(queue)
queue.append("C")
print(queue)


#出棧(取數(shù)據(jù))
res1 = queue.pop()
print("res1 =", res1)
print(queue)
res2 = queue.pop()
print("res2 =", res2)
print(queue)
res3 = queue.pop()
print("res3 =", res3)
print(queue)

隊(duì)列

隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作蜜徽,而在表的后端(rear)進(jìn)行插入操作祝懂,和棧一樣,隊(duì)列是一種操作受限制的線性表拘鞋。進(jìn)行插入操作的端稱為隊(duì)尾砚蓬,進(jìn)行刪除操作的端稱為隊(duì)頭。

它的原則是先進(jìn)先出

<image src='images/deque.png' />



import collections

#創(chuàng)建一個(gè)隊(duì)列
queue = collections.deque()
print(queue)

#進(jìn)隊(duì)(存數(shù)據(jù))
queue.append("A")
print(queue)
queue.append("B")
print(queue)
queue.append("C")
print(queue)


#出隊(duì)(取數(shù)據(jù))
res1 = queue.popleft()
print("res1 =", res1)
print(queue)
res2 = queue.popleft()
print("res2 =", res2)
print(queue)
res3 = queue.popleft()
print("res3 =", res3)
print(queue)

我們的棧和隊(duì)列了其實(shí)就是學(xué)習(xí)一種思想盆色,包裹之前的遞歸都是一中程序的思想

課堂小案例灰蛙,結(jié)合文件

遍歷目錄


import os

def getALlDir(path,sp = '  '):
    filesList = os.listdir(path)
    sp += '  '
    for fileName in filesList:
        filesAbsPath = os.path.join(path, fileName)
        if os.path.isdir(filesAbsPath):
            print(sp + '目錄:',fileName)
            getALlDir(filesAbsPath,sp)
        else:
            print(sp + '文件:',fileName)

getALlDir(r'/Users/ruidong/PycharmProjects')

Time

【1】時(shí)間可以改變一切:time模塊


在我們平常的代碼中,經(jīng)常需要和時(shí)間打交道隔躲。在Python中摩梧,與時(shí)間處理相關(guān)的模塊有:time、datetime以及calendar宣旱。學(xué)會計(jì)算時(shí)間仅父,對程序的調(diào)優(yōu)非常重要,可以在程序中狂打時(shí)間戳浑吟,來具體判斷程序中哪一塊耗時(shí)最多笙纤,從而找到程序調(diào)優(yōu)的重心處。這里先來講一個(gè)time模塊组力。
在開始前省容,先說明幾點(diǎn):

1、在Python中燎字,通常有這幾種方式表示時(shí)間:時(shí)間戳腥椒、格式化的時(shí)間字符串、元組(struct_time 共九種元素)轩触。由于Python的time模塊主要是調(diào)用C庫實(shí)現(xiàn)的寞酿,所以在不同的平臺可能會有所不同。
2脱柱、時(shí)間戳(timestamp)的方式:時(shí)間戳表示是從1970年1月1號 00:00:00開始到現(xiàn)在按秒計(jì)算的偏移量伐弹。查看一下type(time.time())的返回值類型,可以看出是float類型榨为。返回時(shí)間戳的函數(shù)主要有time()惨好、clock()等煌茴。
3、UTC(世界協(xié)調(diào)時(shí))日川,就是格林威治天文時(shí)間蔓腐,也是世界標(biāo)準(zhǔn)時(shí)間。在中國為UTC+8龄句。DST(夏令時(shí)):是一種節(jié)約能源而人為規(guī)定時(shí)間制度回论,在夏季調(diào)快1個(gè)小時(shí)。
4分歇、元組方式:struct_time元組共有9個(gè)元素傀蓉,返回struct_time的函數(shù)主要有g(shù)mtime(),localtime()职抡,strptime()葬燎。

使用該模塊中的函數(shù)時(shí),必須先引入該模塊(import time)

1缚甩、時(shí)間戳

python中的時(shí)間戳是以秒為單位的谱净,它是一個(gè)浮點(diǎn)類型的數(shù)據(jù)。


import time

#時(shí)間戳
print(time.time())
#毫秒時(shí)間戳擅威,
print(time.time() * 1000)
#毫秒時(shí)間戳取整
print(int(time.time() * 1000))

#1510884320.13084
#1510884320130.936
#1510884320130

2壕探、struct_time元祖結(jié)構(gòu)格式

time.localtime(secs)
將一個(gè)時(shí)間戳轉(zhuǎn)換為當(dāng)前時(shí)區(qū)的struct_time,即時(shí)間數(shù)組格式的時(shí)間

如果secs參數(shù)未提供裕寨,則以當(dāng)前時(shí)間為準(zhǔn)(即會默認(rèn)調(diào)用time.time())浩蓉。

#沒有傳入?yún)?shù)

import time
print(time.localtime())

#time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=10, tm_min=14, tm_sec=2, tm_wday=4, tm_yday=321, tm_isdst=0)
#傳入?yún)?shù)的
import time

out_time = time.time() - (60 * 60 * 24 * 365 *2)
print(int(out_time))
print(time.localtime(1447812614))

#1447812789
#time.struct_time(tm_year=2015, tm_mon=11, tm_mday=18, tm_hour=10, tm_min=10, tm_sec=14, tm_wday=2, tm_yday=322, tm_isdst=0)

3派继、將一個(gè)時(shí)間戳轉(zhuǎn)換為UTC時(shí)區(qū)的struct_time

time.gmtime([secs])

time.gmtime() 函數(shù)將一個(gè)時(shí)間戳轉(zhuǎn)換為UTC時(shí)區(qū)(0時(shí)區(qū))的struct_time宾袜,可選的參數(shù)sec表示從1970-1-1 00:00:00以來的秒數(shù)。其默認(rèn)值為time.time()驾窟,函數(shù)返回time.struct_time類型的對象庆猫。(struct_time是在time模塊中定義的表示時(shí)間的對象)。
如果secs參數(shù)未提供绅络,則以當(dāng)前時(shí)間為準(zhǔn)月培。

sec – 轉(zhuǎn)換為time.struct_time類型的對象的秒數(shù)

#注意它是0時(shí)區(qū),就是說比我們的時(shí)間少了8個(gè)小時(shí)
import time

print(time.gmtime())

#time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=2, tm_min=18, tm_sec=12, tm_wday=4, tm_yday=321, tm_isdst=0)

4恩急、time.mktime(t):將一個(gè)struct_time轉(zhuǎn)化為時(shí)間戳

time.mktime(t) 函數(shù)執(zhí)行與gmtime(), localtime()相反的操作杉畜,它接收struct_time對象作為參數(shù),返回用秒數(shù)表示時(shí)間的浮點(diǎn)數(shù)。
如果輸入的值不是一個(gè)合法的時(shí)間衷恭,將觸發(fā) OverflowError 或 ValueError此叠。
參數(shù):

t – 結(jié)構(gòu)化的時(shí)間或者完整的9位元組元素

import time

print(time.mktime(time.localtime()))

#1510885313.0

5、讓程序睡一會

time.sleep(secs):線程推遲指定的時(shí)間運(yùn)行
線程睡眠指定時(shí)間随珠,單位為妙灭袁。

secs:為數(shù)值類型的整數(shù)或浮點(diǎn)數(shù)猬错。


import time

for i in range(1,6):
    print(i)
    time.sleep(1)


#5秒以后觸發(fā)
print("節(jié)日快樂")

6、time.clock()

這個(gè)函數(shù)茸歧, 函數(shù)以浮點(diǎn)數(shù)計(jì)算的秒數(shù)返回當(dāng)前的CPU時(shí)間倦炒。用來衡量不同程序的耗時(shí),比time.time()更有用软瞎。在不同的系統(tǒng)上含義不同逢唤。在NUix系統(tǒng)上,它返回的是“進(jìn)程時(shí)間”涤浇,它是用妙表示的浮點(diǎn)數(shù)(時(shí)間戳)智玻。而在Windows中,第一次調(diào)用芙代,返回的是進(jìn)程運(yùn)行時(shí)實(shí)際時(shí)間吊奢。而第二次之后的調(diào)用是自第一次調(diào)用以后到現(xiàn)在的運(yùn)行時(shí)間。
返回值
該函數(shù)有兩個(gè)功能:

(1)在第一次調(diào)用的時(shí)候纹烹,返回的是程序運(yùn)行的實(shí)際時(shí)間页滚;
(2)第二次之后的調(diào)用,返回的是自第一次調(diào)用后,到這次調(diào)用的時(shí)間間隔在win32系統(tǒng)下铺呵,這個(gè)函數(shù)返回的是真實(shí)時(shí)間(wall time)裹驰,而在Unix/Linux下返回的是CPU時(shí)間。

import time

print(time.clock())
print(time.clock())

#0.066535
#0.0666

7片挂、time.asctime( [t] )

把一個(gè)表示時(shí)間的元組或者struct_time表示為 ‘Sun Aug 23 14:31:59 2015’ 這種形式幻林。如果沒有給參數(shù),會將time.localtime()作為參數(shù)傳入音念。
參數(shù):

t – 9個(gè)元素的元組或者通過函數(shù) gmtime() 或 localtime() 返回的時(shí)間值


import time

local = time.localtime()
asc = time.asctime(local)

print(asc)

Fri Nov 17 10:41:46 2017

8沪饺、time.ctime([secs])

把一個(gè)時(shí)間戳(按秒計(jì)算的浮點(diǎn)數(shù))轉(zhuǎn)化為time.asctime()的形式。如果未指定參數(shù)闷愤,將會默認(rèn)使用time.time()作為參數(shù)整葡。它的作用相當(dāng)于time.asctime(time.localtime(secs))
參數(shù):

secs – 要轉(zhuǎn)換為字符串時(shí)間的秒數(shù)

import time

print(time.ctime())

#Fri Nov 17 10:44:43 2017

9、格式化時(shí)間

time.strftime( format [, t] )

返回字符串表示的當(dāng)?shù)貢r(shí)間讥脐。

把一個(gè)代表時(shí)間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉(zhuǎn)化為格式化的時(shí)間字符串遭居,格式由參數(shù)format決定。如果未指定旬渠,將傳入time.localtime()俱萍。如果元組中任何一個(gè)元素越界,就會拋出ValueError的異常告丢。函數(shù)返回的是一個(gè)可讀表示的本地時(shí)間的字符串枪蘑。
參數(shù):

format:格式化字符串

t :可選的參數(shù)是一個(gè)struct_time對象


%a  本地星期名稱的簡寫(如星期四為Thu)      
%A  本地星期名稱的全稱(如星期四為Thursday)      
%b  本地月份名稱的簡寫(如八月份為agu)    
%B  本地月份名稱的全稱(如八月份為august)       
%c  本地相應(yīng)的日期和時(shí)間的字符串表示(如:15/08/27 10:20:06)       
%d  一個(gè)月中的第幾天(01 - 31)  
%f  微秒(范圍0.999999)    
%H  一天中的第幾個(gè)小時(shí)(24小時(shí)制,00 - 23)       
%I  第幾個(gè)小時(shí)(12小時(shí)制,0 - 11)       
%j  一年中的第幾天(001 - 366)     
%m  月份(01 - 12)    
%M  分鐘數(shù)(00 - 59)       
%p  本地am或者pm的相應(yīng)符      
%S  秒(00 - 61)    
%U  一年中的星期數(shù)腥寇。(00 - 53星期天是一個(gè)星期的開始成翩。)第一個(gè)星期天之    前的所有天數(shù)都放在第0周。     
%w  一個(gè)星期中的第幾天(0 - 6赦役,0是星期天)    
%W  和%U基本相同麻敌,不同的是%W以星期一為一個(gè)星期的開始。    
%x  本地相應(yīng)日期字符串(如15/08/01)     
%X  本地相應(yīng)時(shí)間字符串(如08:08:10)     
%y  去掉世紀(jì)的年份(00 - 99)兩個(gè)數(shù)字表示的年份       
%Y  完整的年份(4個(gè)數(shù)字表示年份)
%z  與UTC時(shí)間的間隔(如果是本地時(shí)間掂摔,返回空字符串)
%Z  時(shí)區(qū)的名字(如果是本地時(shí)間术羔,返回空字符串)       
%%  ‘%’字符  


import time

local_time = time.localtime()

format_time = time.strftime('%Y年%m月%d日 %H:%M:%S',local_time)

print(format_time)
#注意月份是小m(%m),分鐘是大M(%M)乙漓。年是大寫

#2017年11月17日 10:51:10

你也可以玩拼接


import time

local_time = time.localtime()

print(str(local_time.tm_year) + "年" + str(local_time.tm_mon) + "月" + str(local_time.tm_mday) + "日")

#2017年11月17日

獲取當(dāng)前時(shí)間的時(shí)分秒

import time

local_time = time.localtime()

print(time.strftime('%H:%M:%S',local_time))

#10:55:44

獲取當(dāng)前時(shí)間的格式化時(shí)間

import time

t = time.localtime()

print(time.strftime('%F %T',t)) #簡寫
print(time.strftime('%Y-%m-%d %H:%M:%S %p',t)) # am 還是 pm

#2017-11-17 11:23:57
#2017-11-17 11:23:57 AM

10级历、將格式字符串轉(zhuǎn)化成struct_time.

time.strptime(string[,format])

該函數(shù)是time.strftime()函數(shù)的逆操作。time strptime() 函數(shù)根據(jù)指定的格式把一個(gè)時(shí)間字符串解析為時(shí)間元組叭披。所以函數(shù)返回的是struct_time對象寥殖。
參數(shù):

string :時(shí)間字符串
format:格式化字符串


import time,datetime

#創(chuàng)建一個(gè)時(shí)間字符串變量stime
stime = "2015-08-24 13:01:30"

formattime = time.strptime(stime,"%Y-%m-%d %H:%M:%S")

print(formattime)


#遍歷返回的時(shí)間元組序列
for i in formattime :
    print(i,end=' ')

#time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=1, tm_sec=30, tm_wday=0, tm_yday=236, tm_isdst=-1)
#2015 8 24 13 1 30 0 236 -1 

<font color='red'>注意:在使用strptime()函數(shù)將一個(gè)指定格式的時(shí)間字符串轉(zhuǎn)化成元組時(shí),參數(shù)format的格式必須和string的格式保持一致涩蜘,如果string中日期間使用“-”分隔嚼贡,format中也必須使用“-”分隔,時(shí)間中使用冒號“:”分隔同诫,后面也必須使用冒號分隔粤策,否則會報(bào)格式不匹配的錯(cuò)誤。</font>

【2】學(xué)會操控時(shí)間:datetime模塊


Python提供了多個(gè)內(nèi)置模塊用于操作日期時(shí)間误窖,像calendar叮盘,time,datetime霹俺。time模塊我在之前的文章已經(jīng)有所介紹柔吼,它提供 的接口與C標(biāo)準(zhǔn)庫time.h基本一致。相比于time模塊吭服,datetime模塊的接口則更直觀嚷堡、更容易調(diào)用。今天就來講講datetime模塊艇棕。

datetime模塊定義了兩個(gè)常量:datetime.MINYEAR和datetime.MAXYEAR,分別表示datetime所能表示的最 小串塑、最大年份沼琉。其中,MINYEAR = 1桩匪,MAXYEAR = 9999打瘪。(對于偶等玩家,這個(gè)范圍已經(jīng)足夠用矣~~)

datetime模塊定義了下面這幾個(gè)類:

datetime.date:表示日期的類。常用的屬性有year, month, day闺骚;
datetime.time:表示時(shí)間的類彩扔。常用的屬性有hour, minute, second, microsecond;
datetime.datetime:表示日期時(shí)間僻爽。
datetime.timedelta:表示時(shí)間間隔虫碉,即兩個(gè)時(shí)間點(diǎn)之間的長度。
datetime.tzinfo:與時(shí)區(qū)有關(guān)的相關(guān)信息胸梆。(這里不詳細(xì)充分討論該類敦捧,感興趣的童鞋可以參考python手冊)

今天我們講講datetime的基本的幾種方法:

1. 獲取當(dāng)前datetime

import datetime
print(datetime.datetime.now())

#2017-11-17 14:42:01.175940

2. 獲取當(dāng)天date

import datetime
print(datetime.date.today())

#2017-11-17

3. 獲取明天/前N天 /或者昨天

import datetime
print(datetime.date.today())
print(datetime.date.today() + datetime.timedelta(days=1))
print(datetime.date.today() + datetime.timedelta(days=-1))
print(datetime.date.today() - datetime.timedelta(days=1))

#2017-11-17
#2017-11-18
#2017-11-16

4、獲取當(dāng)天開始和結(jié)束時(shí)間(00:00:00 23:59:59)

datetime.combine(date, time):根據(jù)date和time碰镜,創(chuàng)建一個(gè)datetime對象兢卵;

import datetime

print(datetime.datetime.combine(datetime.date.today(), datetime.time.min))
print(datetime.datetime.combine(datetime.date.today(), datetime.time.max))
print((str(datetime.datetime.combine(datetime.date.today(), datetime.time.max)).split('.'))[0])  #轉(zhuǎn)換成str類型的舍去毫秒值


#2017-11-17 00:00:00
#2017-11-17 23:59:59.999999
#2017-11-17 23:59:59

5. 獲取兩個(gè)datetime的時(shí)間差

total_seconds()把兩時(shí)間集轉(zhuǎn)換成總秒數(shù)

print((datetime.datetime(2018,1,13,12,0,0) - datetime.datetime.now()).total_seconds())

#4912373.883664

6.關(guān)系轉(zhuǎn)換

datetime => string
import datetime

date_to_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print(date_to_str,type(date_to_str))

#22014-12-31 18:20:10 <class 'datetime.datetime'>
string => datetime
import datetime

str_to_date = datetime.datetime.strptime("2014-12-31 18:20:10", "%Y-%m-%d %H:%M:%S")

print(str_to_date,type(str_to_date))

#2014-12-31 18:20:10 <class 'datetime.datetime'>
datetime => timetuple (time.struct_time格式)

import datetime

date_to_timetuple = datetime.datetime.now().timetuple()

print(date_to_timetuple,type(date_to_timetuple))

#time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=16, tm_min=31, tm_sec=2, tm_wday=4, tm_yday=321, tm_isdst=-1) <class 'time.struct_time'>
timetuple => datetime

import datetime,time
now = time.localtime() #struct_time類型
print(now)
now = time.strftime("%F %T",ls)  #先轉(zhuǎn)成timestamp時(shí)間格式,轉(zhuǎn)成字符串
print(now,type(now))
now = datetime.datetime.strptime(now, "%Y-%m-%d %H:%M:%S")
print(now,type(now))

datetime => timestamp

import datetime,time

now = datetime.datetime.now()
timestamp = time.mktime(now.timetuple())
print(timestamp,type(timestamp))

#1510908711.0 <class 'float'>
timestamp => datetime

import datetime

datetime = datetime.datetime.fromtimestamp(1421077403.0)
print(datetime,type(datetime))

#2015-01-12 23:43:23 <class 'datetime.datetime'>

7. 獲取本周/本月/上月最后一天 和第一天

本周

date.weekday():返回weekday,如果是星期一绪颖,返回0秽荤;如果是星期2,返回1柠横,以此類推王滤;

import datetime

today = datetime.date.today()
print(today)

one = today - datetime.timedelta(today.weekday())
print(one)  #本周第一天

two = today + datetime.timedelta(6-today.weekday())
print(two)  #本周最后一天


#2017-11-17
#2017-11-13
#2017-11-19

本月

cale是python的日歷模塊

calendar.monthrange(year,month)

返回兩個(gè)整數(shù)。第一個(gè)是該月的星期幾的日期碼滓鸠,第二個(gè)是該月的日期碼雁乡。日從0(星期一)到6(星期日);月從1到12。


import calendar,datetime
today = datetime.date.today()
_,last_day_num = calendar.monthrange(today.year,today.month)
print(last_day_num)
last_day = datetime.date(today.year, today.month,last_day_num)
print(last_day)




#_,取可迭代序列的最后一個(gè)值糜俗,但是不能取中間的踱稍,舍棄如果是三個(gè)那么就是_,_,
#30
#2017-11-30


獲取上個(gè)月的最后一天


import datetime

today = datetime.date.today()
print(today)
first = datetime.date(day=1, month=today.month, year=today.year)
print(first)
lastMonth = first - datetime.timedelta(days=1)
print(lastMonth)

#2017-11-17
#2017-11-01
#2017-10-31

上個(gè)月的最好一天(跨年)


import datetime,time

today = datetime.datetime.strptime('2017-01-01',"%Y-%m-%d")
print(today)
first = datetime.date(day=1, month=today.month, year=today.year)
print(first)
lastMonth = first - datetime.timedelta(days=1)
print(lastMonth)

#2017-01-01 00:00:00
#2017-01-01
#2016-12-31

【3】時(shí)間的書籍:calendar(日歷模塊)

——————

1、日歷

ccalendar(year,w=2,l=1,c=6)
返回一個(gè)多行字符串格式的year年年歷悠抹,3個(gè)月一行珠月,間隔距離為c。 每日寬度間隔為w字符楔敌。每行長度為21* W+18+2* C啤挎。l是每星期行數(shù)。

import calendar
print(calendar.calendar(2017))

2卵凑、獲取每周的開始值

firstweekday()
返回當(dāng)前每周起始日期的設(shè)置庆聘。默認(rèn)情況下,首次載入caendar模塊時(shí)返回0勺卢,即星期一伙判。

import calendar
print(calendar.firstweekday())

#0

3、判斷是否是潤年

calendar.isleap(year)
是閏年返回True黑忱,否則為false宴抚。

<font color='red'>注意:只能是整數(shù)勒魔,否則會報(bào)錯(cuò)</font>


import calendar
print(calendar.isleap(2020))


#True

4、返回在兩個(gè)年數(shù)時(shí)間軸之間的閏年總數(shù)菇曲。

calendar.leapdays(y1,y2)
返回在Y1冠绢,Y2兩年之間的閏年總數(shù)。


import calendar
print(calendar.leapdays(-1000,2017))

#732

5常潮、返回指定月的日歷

calendar.month(year,month,w=2,l=1)

返回一個(gè)多行字符串格式的year年month月日歷弟胀,兩行標(biāo)題,一周一行蕊玷。每日寬度間隔為w字符邮利。每行的長度為7* w+6。l是每星期的行數(shù)垃帅。

import calendar
print(calendar.month(2017,11))

6延届、返回指定月的瑞列表

calendar.monthcalendar(year,month)

返回一個(gè)整數(shù)的單層嵌套列表。每個(gè)子列表裝載代表一個(gè)星期的整數(shù)贸诚。Year年month月外的日期都設(shè)為0;范圍內(nèi)的日子都由該月第幾日表示方庭,從1開始。


import calendar
print(calendar.monthcalendar(2017,11) )

#[[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 0, 0, 0]]

7酱固、返回指定月的最后一天的星期碼和日期碼

calendar.monthrange(year,month)

返回一個(gè)元祖械念。第一個(gè)是該月的星期幾的日期碼,第二個(gè)是該月的最后一天日期碼运悲。日從0(星期一)到6(星期日);月從1到12龄减。


import calendar
time1 = calendar.monthrange(2017,11)
print(time1,type(time1))

#(2, 30) <class 'tuple'>

8、返回指定日期的星期碼

calendar.weekday(year,month,day)

返回給定日期的日期碼班眯。0(星期一)到6(星期日)希停。月份為 1(一月) 到 12(12月)。

import calendar
print(calendar.weekday(2017,11,17))

#4

9署隘、設(shè)置一周里那一天作為第一天

calendar.setfirstweekday(weekday)

設(shè)置每周的起始日期碼宠能。0(星期一)到6(星期日)。

import calendar
print(calendar.firstweekday())
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.firstweekday())

#0
#6

10磁餐、將tupletime轉(zhuǎn)成時(shí)間戳

calendar.timegm(tupletime)

和time.gmtime相反:接受一個(gè)時(shí)間元組形式违崇,返回該時(shí)刻的時(shí)間輟(1970紀(jì)元后經(jīng)過的浮點(diǎn)秒數(shù))。



import calendar,time

now = time.localtime()
date = calendar.timegm(now)
print(date)

#1510940959
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诊霹,一起剝皮案震驚了整個(gè)濱河市羞延,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畅哑,老刑警劉巖肴楷,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荠呐,居然都是意外死亡赛蔫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門泥张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呵恢,“玉大人,你說我怎么就攤上這事媚创∩ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵钞钙,是天一觀的道長鳄橘。 經(jīng)常有香客問我,道長芒炼,這世上最難降的妖魔是什么瘫怜? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮本刽,結(jié)果婚禮上鲸湃,老公的妹妹穿的比我還像新娘。我一直安慰自己子寓,他們只是感情好暗挑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斜友,像睡著了一般炸裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲜屏,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天烹看,我揣著相機(jī)與錄音,去河邊找鬼墙歪。 笑死听系,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虹菲。 我是一名探鬼主播靠胜,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毕源!你這毒婦竟也來了浪漠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤霎褐,失蹤者是張志新(化名)和其女友劉穎址愿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻璃,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡响谓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年损合,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娘纷。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫁审,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赖晶,到底是詐尸還是另有隱情律适,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布遏插,位于F島的核電站捂贿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胳嘲。R本人自食惡果不足惜厂僧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胎围。 院中可真熱鬧吁系,春花似錦、人聲如沸白魂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽福荸。三九已至蕴坪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敬锐,已是汗流浹背背传。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留台夺,地道東北人径玖。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像颤介,于是被迫代替她去往敵國和親梳星。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361