經常使用模塊Part(1)

collections模塊前端

time模塊node

random模塊python

os模塊linux

sys模塊shell

 

collections模塊windows


這個模塊實現了一些很好的數據結構,它們能幫助你解決各類實際問題後端

在這裏主要介紹幾種數據結構,幫助咱們多瞭解不一樣數據類型。服務器

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'])
namedtuple
#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)
deque
#使用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']
OrderedDict
#有以下值集合 [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'
defaultdict
#Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素做爲key,其計數做爲value。計數值能夠是任意的Interger(包括0和負數)。Counter類和其餘語言的bags或multisets很類似。

c = Counter('abcdeabcdabcaba')
print(c)
輸出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
counter

 

 

time模塊數據結構


和時間有關係的咱們就要用到時間模塊。在使用模塊以前,應該首先導入這個模塊。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 當前時區的名稱
%% %號自己
python中時間日期格式化符號:

(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))
練習-計算時間差

 

 

random模塊


隨機模塊:能夠獲取隨機數值,及進行亂序排列等

>>> 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模塊


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)是建立時間(詳細信息參見平臺的文檔)。
stat 結構:
os.sep    輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/"
os.linesep    輸出當前平臺使用的行終止符,win下爲"\r\n",Linux下爲"\n"
os.pathsep    輸出用於分割文件路徑的字符串 win下爲;,Linux下爲:
os.name    輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
os模塊的屬性
#導入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模塊


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裏面運行是報錯的,只有在終端運行才能夠
相關文章
相關標籤/搜索