time模塊node
random模塊python
os模塊linux
sys模塊shell
這個模塊實現了一些很好的數據結構,它們能幫助你解決各類實際問題後端
在這裏主要介紹幾種數據結構,幫助咱們多瞭解不一樣數據類型。服務器
1.namedtuple: 生成可使用名字來訪問元素內容的tuple 2.deque: 雙端隊列,能夠快速的從另一側追加和推出對象 3.Counter: 計數器,主要用來計數 4.OrderedDict: 有序字典 5.defaultdict: 帶有默認值的字典
from collections import namedtuple Point = namedtuple('point',['x','y','z']) #用可命名的元組,更直觀表示空間一個點 p1 = Point(1,2,3) #Point相似一個類,此處實例化了一個名爲p1的對象 p2 = Point(3,2,1) print(p1.x) print(p1.y) print(p1,p2) >>>> 1 2 point(x=1, y=2, z=3) point(x=3, y=2, z=1) #相似的,若是要用座標和半徑表示一個圓,也能夠用namedtuple定義: #namedtuple('名稱', [屬性list]): Circle = namedtuple('Circle', ['x', 'y', 'r'])
#deque指的是雙端隊列 #因此咱們先來學一下什麼是隊列 #隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列 #隊列是先進先出,棧是先進後出 import queue q = queue.Queue() q.put([1,2,3]) q.put(5) q.put(6) print(q) print(q.get()) #先獲得[1,2,3] print(q.get()) #再拿到5 print(q.get()) #最後拿到6 #此時已經取盡隊列的值了,再用get方法,取不到值,隊列會一直等在這裏,就稱爲隊列的阻塞,須要再給值才能繼續運行 print(q.get()) # 阻塞 print(q.qsize()) #size爲3 #deque 雙端隊列 #使用list存儲數據時,按索引訪問元素很快,可是插入和刪除元素就很慢了,由於list是線性存儲,數據量大的時候,插入和刪除效率很低。 #deque是爲了高效實現插入和刪除操做的雙向列表,適合用於隊列和棧: from collections import deque dq = deque([1,2]) dq.append('a') # 從後面放數據 [1,2,'a'] dq.appendleft('b') # 從前面放數據 ['b',1,2,'a'] dq.insert(2,3) #['b',1,3,2,'a'] print(dq.pop()) # 從後面取數據 print(dq.pop()) # 從後面取數據 print(dq.popleft()) # 從前面取數據 print(dq)
#使用dict時,Key是無序的。在對dict作迭代時,咱們沒法肯定Key的順序。 #若是要保持Key的順序,能夠用OrderedDict: #有序字典 from collections import OrderedDict od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # OrderedDict的Key是有序的 print(od['a']) for k in od: print(k) #注意,OrderedDict的Key會按照插入的順序排列,不是Key自己排序: >>> od = OrderedDict() >>> od['z'] = 1 >>> od['y'] = 2 >>> od['x'] = 3 >>> od.keys() # 按照插入的Key的順序返回 ['z', 'y', 'x']
#有以下值集合 [11,22,33,44,55,66,77,88,99,90...],將全部大於 66 的值保存至字典的第一個key中,將小於 66 的值保存至第二個key的值中。 即: {'k1': 大於66 , 'k2': 小於66} from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) #設置了一個默認字典,字典默認valu是一個列表 for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) #使用dict時,若是引用的Key不存在,就會拋出KeyError。若是但願key不存在時,返回一個默認值,就能夠用defaultdict: >>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在 'abc' >>> dd['key2'] # key2不存在,返回默認值 'N/A'
#Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素做爲key,其計數做爲value。計數值能夠是任意的Interger(包括0和負數)。Counter類和其餘語言的bags或multisets很類似。 c = Counter('abcdeabcdabcaba') print(c) 輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
和時間有關係的咱們就要用到時間模塊。在使用模塊以前,應該首先導入這個模塊。app
表示時間的三種方式:
在Python中,一般有這三種方式來表示時間:時間戳、元組(struct_time)、格式化的時間字符串:
(1)時間戳(timestamp) :一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。咱們運行「type(time.time())」,返回的是float類型。
(2)格式化的時間字符串(Format String): ‘1999-12-06’
#python中時間日期格式化符號: %y 兩位數的年份表示(00-99) %Y 四位數的年份表示(000-9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a 本地簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化的月份名稱 %B 本地完整的月份名稱 %c 本地相應的日期表示和時間表示 %j 年內的一天(001-366) %p 本地A.M.或P.M.的等價符 %U 一年中的星期數(00-53)星期天爲星期的開始 %w 星期(0-6),星期天爲星期的開始 %W 一年中的星期數(00-53)星期一爲星期的開始 %x 本地相應的日期表示 %X 本地相應的時間表示 %Z 當前時區的名稱 %% %號自己
(3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
索引(Index) | 屬性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 好比2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(時) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示週一) |
7 | tm_yday(一年中的第幾天) | 1 - 366 |
8 | tm_isdst(是不是夏令時) | 默認爲0 |
時間模塊的經常使用方法,及時間各個表示方式之間的轉換:
import time #時間的三種表示方式: # 1.格式化時間 —— 字符串:直觀顯示時間 print(time.strftime("%Y-%m-%d %a %X") ) #%X 也能夠替換爲 %H:%M:%S HOUR MINUTES SECOND #print(time.strftime("%Y/%m/%d %X") ) #%X 也能夠替換爲 %H:%M:%S HOUR MINUTES SECOND 也能夠設置一個格式 time_format = "%Y-%m-%d %a %X" 而後 time.strftime(time_format) #2.時間戳時間 —— float時間,給計算機看的,是從 1970年1月1日00點00分開始計算的時間偏移量 t2 = time.localtime() print(time.mktime(t2)) #將結構化時間轉爲時間戳,必需要有一個參數 #3.結構化時間 —— structtime,元組(九個變量),用來計算的 struct_time = time.localtime() #localtime 將時間戳返回一個結構化時間,默認爲當前時間 print(struct_time) print(struct_time.tm_year) #有點像 collections模塊的 nametuple方法 #print(time.gmtime()) #格林威治時間,比咱們晚八個小時,將時間戳返回爲一個結構化時間 #print(time.strptime('2010-08-03 20:36:20 Mon','%Y-%m-%d %X %a')) #格式化時間轉換爲結構化時間 #時間戳轉結構化時間 t = time.time() #獲取當前時間的時間戳 print(time.localtime()) print(time.gmtime(t)) #格林威治時間,比咱們晚八個小時,不用參數t也能夠 # 結構化時間轉爲時間戳 t2 = time.localtime() print(time.mktime(t2)) # 格式化時間轉化爲結構化時間 print(time.strptime('2010-08-03 20:36:20 Mon','%Y-%m-%d %X %a')) # 結構化時間轉爲格式化時間 print(time.strftime('%Y-%m-%d %X %a',time.localtime(1500000000)))
#sleep
time.sleep(5) #先在這暫停5秒再往下運行
小結:時間戳是計算機可以識別的時間;時間字符串是人可以看懂的時間;元組則是用來操做時間的
#asctime 和 ctime
#asctime 和 ctime #時間戳和結構化時間轉換爲固定格式的時間 print(time.asctime()) print(time.asctime(time.localtime(1500000000)))
>>>輸出結果,下同
Sat Sep 8 10:09:09 2018
Fri Jul 14 10:40:00 2017
print(time.ctime()) print(time.ctime(1500000000))
#time模塊做業,計算時間差 import time true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S')) time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S')) dif_time=time_now-true_time struct_time=time.gmtime(dif_time) print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1, struct_time.tm_mday-1,struct_time.tm_hour, struct_time.tm_min,struct_time.tm_sec))
隨機模塊:能夠獲取隨機數值,及進行亂序排列等
>>> import random #隨機小數 >>> random.random() # 大於0且小於1之間的小數 0.7664338663654585 >>> random.uniform(1,3) #大於1小於3的小數 1.6270147180533838 #恆富:發紅包 #隨機整數 >>> random.randint(1,5) # 大於等於1且小於等於5之間的整數 >>> random.randrange(1,10,2) # 大於等於1且小於10之間的奇數 #隨機選擇一個返回 >>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5] #隨機選擇多個返回,返回的個數爲函數的第二個參數 >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合 [[4, 5], '23'] #打亂列表順序 >>> item=[1,3,5,7,9] >>> random.shuffle(item) # 打亂次序 >>> item [5, 1, 3, 7, 9] >>> random.shuffle(item) >>> item [5, 9, 7, 1, 3]
import random def v_code(): code = '' for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90)) add=random.choice([num,alf]) code="".join([code,str(add)]) return code print(v_code())
os模塊是與操做系統交互的一個接口
import os print(os.getcwd()) #獲取當前工做目錄,即當前python腳本工做的目錄路徑 #os.chdir(r'C:\Users\15302\PycharmProjects\GKXXX\day14') #跟文件夾有關係的 os.makedirs('dirname1/dirname2') #建立多層遞歸目錄 os.removedirs('dirname1/dirname2') #遞歸刪除目錄,若是2刪除後,1裏是空的,那麼1也會被刪除 os.mkdir('dirname') #只能建立單級目錄 os.rmdir('dirname') #刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname print(os.listdir(r'C:\Users\15302\PycharmProjects\GKXXX')) #列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印os.remove('filename')#刪除一個文件os.renames('old','new') #修改文件名字 print(os.stat('時間模塊.py')) #獲取文件/目錄信息 stat打印出來的信息結構,最下方有說明 print(os.sep) #顯示該操做系統路徑的鏈接方式,用於python代碼跨平臺 print(os.linesep) #輸出當前平臺使用的行終止符 print(os.pathsep) #輸入當前平臺路徑分割符 win是; linux是: print(os.name) #輸入當前平臺操做系統是什麼 nt 爲 windows posix爲Linux os.system('dir') #參數是當前系統可使用的命令,便可以在cmd裏執行的,沒有返回值 print(os.popen('dir').read()) #有返回值,相似 os.system print(os.environ) #獲取系統環境變量
print(os.listdir(os.getcwd())) #打印path下的目錄,只打印一級別,目錄下的子目錄不會被打印
#path os.path 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的大小,返回文件夾大小會不許,可是返回文件會準
stat 結構: st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的設備。 st_nlink: inode 的連接數。 st_uid: 全部者的用戶ID。 st_gid: 全部者的組ID。 st_size: 普通文件以字節爲單位的大小;包含等待某些特殊文件的數據。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由操做系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是建立時間(詳細信息參見平臺的文檔)。
os.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep 輸出當前平臺使用的行終止符,win下爲"\r\n",Linux下爲"\n" os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
#導入OS包 import os #os.getcwd()查看當前目錄 print('\n當前目錄位置:') print(os.getcwd()) #os.chdir修改目錄 os.chdir("E:\python_py\python1_learn") print('\n修改後目錄位置:')
import os import os.path from collections import Counter #windows ,給出一個路徑,遞歸遍歷全部文件;全部重名的文件,只保留一份,其他都刪除。保留的文件目錄未作限定 rootdir = r"F:\CloudMusic\Duomi" dict1={} #存放遍歷到全部文件的:全路徑、文件名稱 list1=[] #存放全部獲取的文件名稱,含重複文件名稱 for parent, dirnames, filenames in os.walk(rootdir): for filename in filenames: dict1[os.path.join(parent, filename)]=filename #key:全路徑,value:文件名稱 list1.append(filename) list2=[str(k) for k,v in dict(Counter(list1)).items() if v>1] #查詢統計大於1的名稱,存儲 todeleteno=0 #統計刪除總數 for l in list2: #遍歷重名名稱列表 n = 0 #計數,同一個名稱內一次計數,計數爲0不刪除,自增後不爲0則刪除 for k,v in dict1.items(): #遍歷 全路徑、文件名稱 字典 if l==v: #當字典value(文件名稱)等於重名列表中字符 if n==0: #計數爲0不刪除 print('不刪:{v}-----{k}'.format(v=v, k=k)) else: #自增後不爲0則刪除 todeleteno+=1 print('刪除{n}:{v}-----{k}'.format(n=str(todeleteno).zfill(5),v=v, k=k)) #慎用刪除,沒事就註釋掉 # os.remove(k) n+=1 print("刪除總數:"+str(todeleteno))
sys模塊是與python解釋器交互的一個接口
#python解釋器交互的模塊 import sys #print(sys.exit()) #退出當前程序,正常退出時exit(0),錯誤退出sys.exit(1) #若是我這裏退出了,下面都不會執行了 # print(sys.platform) #返回操做平臺,可是隻能區分大平臺,32位仍是64位區分不出來。。。 # print(sys.version) #獲取pyhon解釋程序的版本信息 # print(sys.path) #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
# sys.path.append(path) #當想導入自定義模塊的時候,能夠把自定義模塊的路徑加到 sys.path
# print(sys.modules.keys())
#當你要導入某個模塊的時候,能夠在這裏找,是否已經導入過該模塊
ret = sys.argv #有時候腳本沒在pycharm運行,好比要放到服務器上運行,此時用cmd執行的時候,能夠在腳本後面帶上參數,好比用戶名和密碼 #經過argv就能夠獲取命令行參數,從而達到驗證登錄信息,或者作其餘事情 #好比如下代碼在terminal運行: # (venv) C:\Users\15302\PycharmProjects\GKXXX\day13>python sys模塊.py gkx gkx123 # 登錄成功 # 你可使用計算器了 name = ret[1] #其中argv返回的列表中 argv[0]是其文件名自己,注意在命令行空格才表示新元素,用逗號命令行會認爲是同一個元素 pwd = ret[2] if name=='gkx' and pwd == 'gkx123': print('登錄成功') else: print('登錄失敗,退出程序') sys.exit() print('你可使用計算器了') #注意以上程序在pycharm裏面運行是報錯的,只有在終端運行才能夠