天天看點

python-時間子產品,random、os、sys、shutil、json和pickle子產品

一、time與datetime子產品

time子產品:

  時間戳:表示的是從1970年1月1日00:00:00開始按秒計算的偏移量,傳回類型為float類型

  格式化時間字元串(Format String)

  結構化的時間(struct_time):struct_time元組共有9個元素(年月日時分秒,一年中的第幾周,一年中的第幾天,夏令時)

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
# 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子產品:

包含如下類:

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
# 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子產品

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
# 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解釋器

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
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環境變量中。

實作模拟進度條:

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
"""
    當程式要進行耗時操作時例如  讀寫  網絡傳輸
    需要給使用者提示一個進度資訊
    "[*********        ]"
    "[*********       ]"
    "[************    ]"
    "[****************]"
"""
# 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子產品

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
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子產品

該子產品擁有許多檔案、檔案夾、壓縮包等處理功能

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
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對象的過程

python-時間子產品,random、os、sys、shutil、json和pickle子產品
python-時間子產品,random、os、sys、shutil、json和pickle子產品
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可以序列化所有的資料類型,包括類,函數都可以序列化。

  

焚膏油以繼晷,恒兀兀以窮年。