python-時間模塊,random、os、sys、shutil、json和pickle模塊
一、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)View Code# 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()的形式
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)View Code
二、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)View Code
#註 :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是正常退出,其他為異常)View Code
註:如果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") breakView Code
四、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的大小View Code
五、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 刪除?目錄 可以設置忽略略?文件View Code
壓縮與解壓縮:
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)View Code
總結:
json是可以在不同語言之間交換數據的,而pickle只在python之間使用。
json只能序列化最基本的數據類型,而pickle可以序列化所有的數據類型,包括類,函數都可以序列化。
python-時間模塊,random、os、sys、shutil、json和pickle模塊