一、time與datetime子產品
time子產品:
時間戳:表示的是從1970年1月1日00:00:00開始按秒計算的偏移量,傳回類型為float類型
格式化時間字元串(Format String)
結構化的時間(struct_time):struct_time元組共有9個元素(年月日時分秒,一年中的第幾周,一年中的第幾天,夏令時)

# print(time.time())#1533962144.060534
# print(time.localtime())#time.struct_time(tm_year=2018, tm_mon=8, tm_mday=11, tm_hour=12, tm_min=36, tm_sec=4, tm_wday=5, tm_yday=223, tm_isdst=0)
# print(time.localtime(1533962144.060534))#time.struct_time(tm_year=2018, tm_mon=8, tm_mday=11, tm_hour=12, tm_min=35, tm_sec=44, tm_wday=5, tm_yday=223, tm_isdst=0)
# print(time.gmtime()) # UTC時區的struct_time
# print(time.strftime("%Y-%m-%d %X"))#2018-08-11 12:37:32 把一個代表時間的元組或者struct_time轉化為格式化的時間字元串
# print(time.strftime("%Y-%m-%d %H:%M:%S"))#2018-08-11 12:54:11
# print(time.strptime('2012-10-10','%Y-%m-%d'))把格式化時間轉換為結構化
# mktime(t) : 将一個struct_time結構化時間轉化為時間戳。
# print(time.mktime(time.localtime()))#1533962846.0
#格林威治時間
#asctime([t]) : 把一個表示時間的元組或者struct_time表示為這種形式:'Sun Jun 20 23:21:05 1993'
# print(time.ctime())#Sat Aug 11 12:50:17 2018 把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式
View Code
datetime子產品:
包含如下類:

# datetime子產品
import datetime
print(datetime.datetime.now())#2018-08-11 13:08:02.573983
# print(datetime.datetime.now() + datetime.timedelta(3)) #目前時間+3天
# print(datetime.datetime.now() + datetime.timedelta(-3)) #目前時間-3天
# print(datetime.datetime.now() + datetime.timedelta(hours=3)) #目前時間+3小時
# print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #目前時間+30分
print (datetime.datetime.now() + datetime.timedelta(days=30,hours=1,minutes=1,seconds=1))
# 替換時間:replace 可替換某個時間的值
res = datetime.datetime.now()
res = res.replace(year=1997)
print(res)
二、random子產品

# print(random.random())# 用于産生一個 0<=x<1 之間的随機浮點數 開閉
# print(random.randint(1,8))# random.randint(a, b),用于生成一個指定範圍内的整數 開開
# print(random.randrange(1,8,3))# random.randrange([start], stop[, step])
# print(random.choice([1,2,32,3,2,"哈哈"]))#random.choice(sequence)從中選一個
# print(random.sample([1,2,32,3,2,"哈哈"],2)) #random.sample(sequence, k),從指定序列中随機擷取指定長度的片斷。sample函數不會修改原有序列
# res = [1,2,32,3,2,"哈哈"]
# random.shuffle(res) #打亂原有清單中的元素
# print(res)
#注 :sequence在python不是一種特定的類型,而是泛指一系列的類型。list, tuple, 字元串都屬于sequence
三、sys子產品
用來處理Python運作時配置以及資源,進而可以與前當程式之外的系統環境互動,如:
Python解釋器。

import sys
print(sys.argv)#['D:/練習/時間至json子產品/時間子產品.py']
print(sys.version)#3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]
print(sys.maxsize)#最大的int值
print(sys.path)#傳回子產品的搜尋路徑
print(sys.platform)#傳回作業系統平台名稱
# sys.exit() #(0是正常退出,其他為異常)
注:如果python中導入的package或module不在環境變量PATH中,那麼可以使用sys.path将要導入的package或module加入到PATH環境變量中。
實作模拟進度條:

"""
當程式要進行耗時操作時例如 讀寫 網絡傳輸
需要給使用者提示一個進度資訊
"[********* ]"
"[********* ]"
"[************ ]"
"[****************]"
"""
# print("[* ]")
# print("[** ]")
print("[%-10s]" % ("*" * 1))
print("[%-10s]" % ("*" * 2))
print("[%-10s]" % ("*" * 3))
print("[%-10s]" % ("*" * 4))
# 比例 0 - 1 0.5
def progress(percent,width=30):
percent = percent if percent <= 1 else 1
text = ("\r[%%-%ds]" % width) % ("*" * int((width * percent)))
text = text + "%d%%"
text = text % (percent * 100)
print( text , end="")
# 模拟下載下傳
# 檔案大小
import time
file_size = 10240
# 已經下載下傳大小
cur_size = 0
while True:
time.sleep(0.5)
cur_size += 1021
progress(cur_size / file_size)
if cur_size >= file_size:
print()
print("finish")
break
四、os子產品

import os
print(os.getcwd())#擷取目前⼯工作⽬目錄,即目前python腳本⼯工作的⽬目錄路路徑
os.chdir('dirname')# 改變目前腳本⼯工作⽬目錄;相當于shell下cd
print(os.curdir)#傳回目前⽬目錄,就是一個'.'
os.pardir 擷取目前⽬目錄的⽗父⽬目錄字元串串名:('..')
os.makedirs('dirname1/dirname2')#生成多層遞歸目錄
os.removedirs('dirname1')#若⽬目錄為空,則删除,并遞歸到上⼀一級⽬目錄
os.mkdir('dirname')#⽣生成單級⽬目錄;相當于shell中mkdir dirname
os.rmdir('dirname') #删除單級空⽬目錄,若⽬目錄不不為空則⽆無法删除,報錯;相 當于shell中rmdir dirname
print(os.listdir('dirname'))#列列出指定⽬目錄下的所有⽂檔案和⼦子⽬目錄,包括隐藏⽂檔案, 并以列列表⽅方式列印
os.remove('1.py') #删除⼀一個⽂檔案
os.rename("oldname","newname") 重命名⽂檔案/⽬目錄
os.stat('path/filename') 擷取⽂檔案/⽬目錄資訊
print(os.stat('D:\練習\時間至json子產品\時間子產品.py'))
print(os.name ) #輸出字元串串訓示目前使⽤用平台。win->'nt'; Linux->'posix'
print(os.sep) #輸出作業系統特定的路路徑分隔符,win下為"\",Linux下為"/"
os.linesep #輸出目前平台使⽤用的⾏行行終⽌止符,win下為"\t\n",Linux下為"\n"
print(os.pathsep)#輸出⽤用于分割⽂檔案路路徑的字元串串 win下為;,Linux下為:
os.system("bash command")# 運⾏行行shell指令,直接顯示
print(os.environ) #擷取系統(計算機)環境變量量
os.path.abspath(path) 傳回path規範化的絕對路徑
os.path.split(path) 将path分割成目錄和檔案名二進制組傳回
os.path.dirname(path) 傳回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 傳回path最後的檔案名。如何path以/或\結尾,那麼就會傳回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,傳回True;如果path不存在,傳回False
os.path.isabs(path) 如果path是絕對路徑,傳回True
os.path.isfile(path) 如果path是一個存在的檔案,傳回True。否則傳回False
os.path.isdir(path) 如果path是一個存在的目錄,則傳回True。否則傳回False
os.path.join(path1[, path2[, ...]]) 将多個路徑組合後傳回,第一個絕對路徑之前的參數将被忽略
os.path.getatime(path) 傳回path所指向的檔案或者目錄的最後存取時間
os.path.getmtime(path) 傳回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 傳回path的大小
五、shutil子產品
該子產品擁有許多檔案、檔案夾、壓縮包等處理功能

import shutil
# shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
# shutil.copyfileobj(fsrc, fdst[, length])(copyfileobj方法隻會拷貝檔案内容)将檔案内容拷貝到另一個檔案中
# shutil.copyfile('f1.log', 'f2.log')(copyfile隻拷貝檔案内容)
# shutil.copy('f1.log', 'f2.log') 拷貝檔案和權限
# shutil.copystat (src, dst) 拷⻉貝⽂檔案狀态資訊 後通路 後修改 權限 提供兩 個⽂檔案路路徑
# shutil.move (src, dst) 移動⽬目錄和⽂檔案
# shutil.ignore_patterns(*patterns)忽略指定的檔案。通常配合下面的copytree()方法使用。
# shutil.copytree (src, dst, symlinks=False, ignore=None) 拷⻉貝⽬目錄
# symlinks:指定是否複制軟連結。小心陷入死循環。
# ignore:指定不參與複制的檔案,其值應該是一個ignore_patterns()方法。
# copy_function:指定複制的模式
# shutil.rmtree 删除⽬目錄 可以設定忽略略⽂檔案
壓縮與解壓縮:
shutil 可以打包 但是⽆無法解包 并且打包也是調⽤用tarfile 和 zipFile完成 ,解壓需要按照格式調⽤用對應的子產品
打包:
import shutil
#将
/Users/jerry/PycharmProjects/package/packa ge1下的檔案打包放置 /test/目錄
shutil.make_archive("test","tar","/Users/jerry/PycharmProjects/package/packa ge1")
ZipFile和TarFile
import zipfile
# 壓縮
z = zipfile.ZipFile('zfj.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解壓
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()
import tarfile
# 壓縮
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close()
# 解壓
tar = tarfile.open('your.tar','r')
tar.extractall() # 可設定解壓位址
tar.close()
注:zipfile壓縮不會保留檔案狀态資訊,tarfile會保留
六、json和pickle子產品
1.序列化:把對象(變量)從記憶體中變成可存儲或傳輸的過程稱之為序列化.反之則稱之為反序列化
2.序列化的好處
1.資料持久儲存
2.跨平台資料互動
1.json子產品:
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式
encoding(序列化):把python對象轉換成json字元串
decoding(反序列化):把json字元串轉換成python對象import json
# dumps把特定的對象序列化處理為字元串,外形和原來的長的一樣,如果直接将dict類型的資料寫入json檔案中會發生報錯
# dic = {"name":'zfj',"age" : 18}
# dic1 = json.dumps(dic)
# print(type(dic))#<class 'dict'>
# print(dic1)# {"name": "zfj", "age": 18}
# rdic = json.loads(dic1)#反序列化
# print(rdic)
name_emb = {'a': '1111', 'b': '2222', 'c': '3333', 'd': '4444'}
# 資料轉成str,并寫入到json檔案中
json.dump(name_emb, open('db.json', "a"))
# 注:json.load() 用于從json檔案中讀取資料
jsObj = json.load(open('db.json'))
print(jsObj)
print(type(jsObj))
2.pickle子產品
與json子產品不同的是pickle子產品序列化和反序列化的過程叫:pickling和unpickling
pickling:将python對象轉換為位元組流的過程
unpickling:将位元組流二進制檔案或位元組對象轉換成python對象的過程

import pickle
dic = {"name":'zfj',"age" : 18}
# dumps&loads
# 序列化
# dic1 = pickle.dumps(dic)
# print(dic1)#b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00zfjq\x02X\x03\x00\x00\x00ageq\x03K\x12u.'
# print(type(dic1))#<class 'bytes'>
#反序列化
# rdic = pickle.loads(dic1)
# print(rdic)#{'name': 'zfj', 'age': 18}
# dump&load
# 序列化
with open('pickle.txt', 'wb') as f:
pickle.dump(dic, f)
# 反序列化
with open('pickle.txt', 'rb') as f:
rdic = pickle.load(f)
print(rdic)
總結:
json是可以在不同語言之間交換資料的,而pickle隻在python之間使用。
json隻能序列化最基本的資料類型,而pickle可以序列化所有的資料類型,包括類,函數都可以序列化。
焚膏油以繼晷,恒兀兀以窮年。