random 模塊 隨機:在某個範圍內取到每一個值的概率是相同的 練習:生成隨機驗證碼 # (1)4位數字的驗證碼 # 基礎版本 lis = '' for i in range(4): num = random.randint(0, 9) lis += str(num) print(lis) # 函 ...
random 模塊
隨機:在某個範圍內取到每一個值的概率是相同的
import random # 隨機小數 print(random.random()) # 0-1之內的隨機小數 print(random.uniform(1, 5)) # 任意範圍之內的隨機小數 # 隨機整數 print(random.randint(1, 2)) # [1,2] 包含2在內的範圍內隨機取整數 print(random.randrange(1, 2)) # [1,2) 不包含2在內的範圍內隨機取整數 print(random.randrange(1, 10, 2)) # [1,10) 不包含10在內的範圍內隨機取奇數 # 隨機抽取 lst = [1, 2, 3, 'abc', ('wahaha', 'qqxing')] ret = random.choice(lst) # 隨機抽取一個值 print(ret) ret1 = random.sample(lst, 2) # 隨機抽取兩個值 print(ret1) # 打亂順序 在原列表的基礎上做亂序 lst = [1, 2, 3, 'abc', ('wahaha', 'qqxing')] random.shuffle(lst) print(lst)
練習:生成隨機驗證碼
# (1)4位數字的驗證碼 # 基礎版本 lis = '' for i in range(4): num = random.randint(0, 9) lis += str(num) print(lis) # 函數版本 def rand_code(n=4): lis = '' for i in range(n): num = random.randint(0, 9) lis += str(num) return lis print(rand_code(6)) # (2)6位 數字+字母 def rand_code(n): code = '' for i in range(n): rand_num = str(random.randint(0, 9)) rand_alph = chr(random.randint(97, 122)) rand_alph_upper = chr(random.randint(65, 90)) rand_num = random.choice([rand_num, rand_alph, rand_alph_upper]) code += rand_num return code ret = rand_code(4) print(ret) # (3)可控制驗證碼 數字 / 數字+字母 def rand_code(num, DefaultAlph=True): # 當DefaultAlph=True時生成字母+數字的驗證碼, 為False時生成純數字驗證碼 code = '' for i in range(num): rand_num = str(random.randint(0, 9)) if DefaultAlph: rand_alph = chr(random.randint(97, 122)) rand_alph_upper = chr(random.randint(65, 90)) rand_num = random.choice([rand_num, rand_alph, rand_alph_upper]) code += rand_num return code ret = rand_code(4, DefaultAlph=False) print(ret)生成驗證碼
time 模塊
#常用方法 1.time.sleep(secs) (線程)推遲指定的時間運行。單位為秒。 2.time.time() 獲取當前時間戳
表示時間的三種方式
在python中,通常用這三種方式表示時間:時間戳、格式化的時間字元串、元組(struct_time)。
- 時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。
- 格式化的時間字元串(Format String): ‘1999-12-06’
%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中時間日期格式化符號: - 元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
索引(Index) 屬性(Attribute) 值(Values) 0 tm_year(年) 比如2018 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
認識Python中表示時間的幾種格式:
# 時間模塊 import time # 時間戳 print(time.time()) # 返回當前時間的時間戳 # 結果>>> 1543743462.3950245 # 時間字元串 print(time.strftime('%Y-%m-%d %X')) # 結果>>> 2018-12-02 17:39:58 print(time.strftime('%Y-%m-%d %H-%M-%S')) # 結果>>> 2018-12-02 17-39-58 # 時間元組:localtime將一個時間戳轉換為當前時區的struct_time print(time.localtime()) # 結果>>> time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=17, tm_min=43, tm_sec=44, tm_wday=6, tm_yday=336, tm_isdst=0)
小結:時間戳是電腦能夠識別的時間;時間字元串是人能夠看懂的時間;元組則是用來操作時間的。
time模塊相關方法:
time.localtime([secs]):將一個時間戳轉換為當前時區的struct_time;secs參數未提供,則以當前時間為準。 time.gmtime([secs]):和 localtime()類似;gmtime()方法是將一個時間戳轉換為UTC時區(0 時區)的struct_time。 time.time():返回當前時間戳 time.mktime(t):將一個time.struct_time轉為時間戳 time.sleep(secs):線程推遲指定的時間運行,單位為秒 time.asctime([t]):把一個表示時間的元組或者struct_time表示為這種形式:'Sun Dec 2 17:52:36 2018'。如果沒有參數,預設將time.localtime()作為參數傳入 time.ctime([t]):把一個時間戳(按秒計算的浮點數)轉為time.asctime()的形式。如果參數未給或者為None的時候,預設將time.time()作為參數,相當於time.asctime(time.localtime(secs)) time.strftime(format[, t]):把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉為格式化的時間字元串,如果t未指定,預設傳入time.localtime() time.strptime(string[, format]):把一個格式化時間字元串轉化為struct_time。實際上它和strftime()是逆操作
幾種格式之間的轉化
# 時間戳——>結構化時間 # time.gmtime(時間戳) #UTC時間,與英國倫敦當地時間一致 # time.localtime(時間戳) #當地時間。例如我們現在在北京執行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 北京時間 print(time.gmtime(1510000000)) #結果>>> time.struct_time(tm_year=2017, tm_mon=11, tm_mday=6, tm_hour=20, tm_min=26, tm_sec=40, tm_wday=0, tm_yday=310, tm_isdst=0) print(time.localtime()) #結果>>> time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=18, tm_min=4, tm_sec=23, tm_wday=6, tm_yday=336, tm_isdst=0) # 結構化時間——>時間戳 # time.mktime(結構化時間) time_tuple = time.localtime(1510000000) print(time.mktime(time_tuple)) #結果>>> 1510000000.0
# 結構化時間——>字元串時間 # time.strftime("格式定義","結構化時間") 結構化時間參數若不傳,則顯示當前時間 print(time.strftime("%Y-%m-%d %X")) #結果>>> 2018-12-02 18:07:47 print(time.strftime("%Y-%m-%d", time.localtime(1510000000))) #結果>>> 2017-11-07 # 字元串時間——>結構化時間 # time.strptime(時間字元串,字元串對應格式) print(time.strptime("2018-02-22", "%Y-%m-%d")) #結果>>> time.struct_time(tm_year=2018, tm_mon=2, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=53, tm_isdst=-1) print(time.strptime("2018/03/01", "%Y/%m/%d")) #結果>>> time.struct_time(tm_year=2018, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=60, tm_isdst=-1)
# 結構化時間 ——> %a %b %d %H:%M:%S %Y串 # time.asctime(結構化時間) 如果不傳參數,直接返回當前時間的格式化串 print(time.asctime(time.localtime(1510000000))) #結果>>> Tue Nov 7 04:26:40 2017 print(time.asctime()) #結果>>> Sun Dec 2 18:12:19 2018 # 時間戳 ——> %a %b %d %H:%M:%S %Y串 # time.ctime(時間戳) 如果不傳參數,直接返回當前時間的格式化串 print(time.ctime()) #結果>>> Sun Dec 2 18:13:14 2018 print(time.ctime(1510000000)) #結果>>> Tue Nov 7 04:26:40 2017
# 結構化時間 struct_time = time.localtime() struct_time = time.strptime('%s-%s-1'%(struct_time.tm_year,struct_time.tm_mon),'%Y-%m-%d') print(time.mktime(struct_time)) # 格式化時間 ret = time.strftime('%Y-%m-1') struct_time = time.strptime(ret,'%Y-%m-%d') print(time.mktime(struct_time))計算本月一號的時間戳時間
datetime 模塊
相比於time模塊,datetime模塊的介面則更直觀,更容易調用
- datetime模塊定義了下麵這幾個類:
- datetime.date:表示日期的類;常用的屬性有year, month, day;
- datetime.time:表示時間的類;常用的屬性有hour, minute, second, microsecond;
- datetime.datetime:表示日期時間。
- datetime.timedelta:表示時間間隔,即兩個時間點之間的長度。
- datetime.tzinfo:與時區有關的相關信息。
import datetime print(datetime.datetime.now()) # 現在的時間 # 只能調整的欄位:weeks days hours minutes seconds print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周後 print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前 print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前 print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天後 print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小時後 print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小時前 print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分鐘前 print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分鐘後 print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前 print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒後 current_time = datetime.datetime.now() # 可直接調整到指定的 年 月 日 時 分 秒 等 print(current_time.replace(year=1977)) # 直接調整到1977年 print(current_time.replace(month=1)) # 直接調整到1月份 print(current_time.replace(year=1989,month=4,day=25)) # 1989-04-25 18:49:05.898601 # 將時間戳轉化成時間 print(datetime.date.fromtimestamp(1232132131)) # 2009-01-17
sys 模塊
sys模塊是與python解釋器交互的一個介面
sys.argv 命令行參數List,第一個元素是程式本身路徑,(類似shell中調用腳本後面傳入的$1,$2,$3) sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1) sys.version 獲取Python解釋程式的版本信息 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform 返回操作系統平臺名稱
name = sys.argv[1] pwd = sys.argv[2] if name == 'xiaobai' and pwd == 'a123456': print('執行以下代碼') else: exit()sys.argv用法
os 模塊
os 模塊是與操作系統交互的一個介面
#當前執行這個python文件的工作目錄相關的工作路徑
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字元串名:('..')
#和文件夾相關
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印
# 和文件相關
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
# 和操作系統差異相關
os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割文件路徑的字元串 win下為;,Linux下為:
os.name 輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix'
# 和執行系統命令相關
os.system("bash command") 運行shell命令,直接顯示
os.popen("bash command).read() 運行shell命令,獲取執行結果
os.environ 獲取系統環境變數
#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的大小
註意:os.stat('path/filename') 獲取文件/目錄信息 的結構說明
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 結構
練習
import os, sys SIZE = 0 def countDirSize(path): global SIZE pathDirList = os.listdir(path) for fileName in pathDirList: newAbsPath = os.path.join(path, fileName) if os.path.isdir(newAbsPath): SIZE += os.path.getsize(newAbsPath) countDirSize(newAbsPath) else: SIZE += os.path.getsize(newAbsPath) def win(): path = input('請輸入需要統計的目錄>>> ') if os.path.exists(path): countDirSize(path) else: print("請輸入正確的路徑...") exit() return SIZE def linux(): path = sys.argv[1] if os.path.exists(path): countDirSize(path) else: print("請輸入正確的路徑...") exit() return SIZE if __name__ == '__main__': if os.name == "nt": print(win()) elif os.name == "posix": print(linux())統計目錄大小