第20天 內建模組一
阿新 • • 發佈:2018-12-15
人生三問
1. 內建模組是什麼 內建模組就是python編譯器裡面自帶的一些模組,我們沒有必要去寫,但是可以直接使用! 2. 為什麼要使用內建模組 在日常工作中,我們需要去寫一些模組去解決一些特定的功能,但是對於一些比較常用的功能,python直譯器已經幫我們寫好了,你說你是想直接拿來就用呢?還是再自己去寫一個模組,當然是直接用啊。 3. 內建模組怎麼使用 內建模組和我們自定義的模組是一樣的,通過import和from匯入進行使用
介紹的模組:
time
datetimesysshutilrandomos
模組一: time
1. 時間戳
>>> time.time() # 代表的是從1970年開始到現在經過的秒數1539593357.4160235
2. 結構化時間
>>> time.localtime() # 通過localtime方法獲得當前系統的結構化時間 time.struct_time(tm_year=2018, tm_mon=10, tm_mday=15, tm_hour=16, tm_min=49, tm_sec=56, tm_wday=0, tm_yday=288, tm_isdst=0) >>> a = time.localtime() >>> a.tm_year # 可以通過.後面跟上屬性檢視相應的值 2018
3. 格式化字串時間
>>> time.strftime('%Y-%m-%d %X') # 通過輸入%多少來獲得對應的值 '2018-10-15 16:57:24' >>>
格式化的標準:
%a Locale’s abbreviated weekday name. %A Locale’s full weekday name. %b Locale’s abbreviated month name. %B Locale’s full month name. %c Locale’s appropriate date and格式化字串的時間格式time representation. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %I Hour (12-hour clock) as a decimal number [01,12]. %j Day of the year as a decimal number [001,366]. %m Month as a decimal number [01,12]. %M Minute as a decimal number [00,59]. %p Locale’s equivalent of either AM or PM. (1) %S Second as a decimal number [00,61]. (2) %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3) %w Weekday as a decimal number [0(Sunday),6]. %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3) %x Locale’s appropriate date representation. %X Locale’s appropriate time representation. %y Year without century as a decimal number [00,99]. %Y Year with century as a decimal number. %z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. %Z Time zone name (no characters if no time zone exists). %% A literal '%' character.
4. 三種時間格式之間的轉換
因為計算機認識的時間格式只有時間戳的格式,但是對於我們人類而言,時間戳的格式又太難懂,因此我們把時間戳的格式轉換成【結構化的時間】或者是【格式化字串的時間】型別,轉換關係如下。
5. 時間的轉換
#------------------------------------------------按照圖1中的關係進行時間的轉換# 時間之間的轉換操作 # 定義三個型別的時間 a = time.time() # 得到時間戳 b = time.localtime() # 結構化時間 c = time.strftime('%Y-%m-%d %H-%M-%S') # 格式化字串時間 # 結構化時間轉為時間戳和格式化字串時間的兩種方式 d = time.mktime(b) e = time.strftime('%Y-%m-%d', b) # 時間戳轉換成結構化時間 f = time.localtime(a) g = time.gmtime(a) # 格式化字串時間轉化為結構化時間 h = time.strptime(c, '%Y-%m-%d %H-%M-%S') # c是什麼樣格式的後面的格式就要寫成什麼樣格式的
6. 圖二的兩種方式其實就是把時間轉換成外國人能夠接受的時間
# ---------------------------按照圖二的方式進行時間的轉換 # 如果不進行傳參,ctime和asctime得到得是一樣的效果,都是轉換成【week month day time year】 >>> time.asctime() 'Mon Oct 15 18:23:37 2018' >>> time.ctime() 'Mon Oct 15 18:23:44 2018' >>> # 如果進行傳參 >>> a = time.time() # 先得到時間戳 >>> b = time.localtime() # 得到結構化時間 >>> time.asctime(b) # 通過asctime把結構化時間轉換成固定的外國人接受的時間 'Mon Oct 15 18:28:12 2018' >>> time.ctime(a) # 通過ctime將時間戳轉換成外國人能夠接受的時間 'Mon Oct 15 18:28:06 2018' >>>
模組二:datatime
>>> print(datetime.datetime.now()) # 通過datetime的now方法獲取當前時間格式 2018-10-15 18:40:17.028194 >>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2018, 10, 15, 18, 40, 34, 551056) >>> print(datetime.datetime.fromtimestamp(time.time())) # 通過fromtimestamp轉換成相應的時間格式 2018-10-15 18:40:57.722764 >>>
datetime重要的作用,用來做時間的加減
print(datetime.datetime.now()) # 展示現在的時間 格式為 【year:month:day hour:minute:second 】 print(datetime.datetime.fromtimestamp(time.time())) # 將時間戳轉換成datetime的形式 # 當前時間加減三天 print(datetime.datetime.now() + datetime.timedelta(3)) print(datetime.datetime.now() + datetime.timedelta(-3)) # 當前時間加減三個小時 print(datetime.datetime.now() + datetime.timedelta(hours=3)) print(datetime.datetime.now() + datetime.timedelta(hours=-3)) # 當前時間加減三十分鐘 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) print(datetime.datetime.now() + datetime.timedelta(minutes=-30))
替換:
c_time = datetime.datetime.now() print(c_time, type(c_time)) print(c_time.replace(month=11, year=2020, minute=10)) print(c_time)
模組三: sys模組
''' sys模組(python直譯器相關的) 1. sys.argv # 這個是傳入的引數,返回的是列表的形式,第一個是當前執行檔案的名稱 2. sys.path # 系統的環境變數,可以通過append方法進行更改 3. sys.modules # 記憶體已經載入的模組,以字典的形式存在 4. sys.version # 直譯器的版本 5. sys.platform # 當前執行的平臺 6. sys.exit() # 退出當前執行的python直譯器 # 瞭解 7. sys.api_version # api版本號 8. sys.maxsize # 最大值得整數32位為 2 ** 32 - 1 64位為2 ** 64 -1 9. sys.maxunicode # 最大的unicode 0x10FFFF '''
>>> import sys >>> sys.version '3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]' >>> sys.api_version 1013 >>> sys.platform 'win32' >>> sys.path ['', 'E:\\software\\python3\\python36.zip', 'E:\\software\\python3\\DLLs', 'E:\\software\\python3\\lib', 'E:\\software\\python3', 'E:\\software\\python3\\lib\\site-packages'] >>> ays.maxunicode Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'ays' is not defined >>> sys.maxunicode 1114111 >>> sys.maxsize 2147483647 >>> sys.modules {'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from 'E:\\software\\python3\\lib\\encodings\\__init__.py'>, 'codecs': <module 'codecs' from 'E:\\software\\python3\\lib\\codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from 'E:\\software\\python3\\lib\\encodings\\aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'E:\\software\\python3\\lib\\encodings\\utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' (built-in)>, 'encodings.latin_1': <module 'encodings.latin_1' from 'E:\\software\\python3\\lib\\encodings\\latin_1.py'>, 'io': <module 'io' from 'E:\\software\\python3\\lib\\io.py'>, 'abc': <module 'abc' from 'E:\\software\\python3\\lib\\abc.py'>, '_weakrefset': <module '_weakrefset' from 'E:\\software\\python3\\lib\\_weakrefset.py'>, 'site': <module 'site' from 'E:\\software\\python3\\lib\\site.py'>, 'os': <module 'os' from 'E:\\software\\python3\\lib\\os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from 'E:\\software\\python3\\lib\\stat.py'>, '_stat': <module '_stat' (built-in)>, 'ntpath': <module 'ntpath' from 'E:\\software\\python3\\lib\\ntpath.py'>, 'genericpath': <module 'genericpath' from 'E:\\software\\python3\\lib\\genericpath.py'>, 'os.path': <module 'ntpath' from 'E:\\software\\python3\\lib\\ntpath.py'>, '_collections_abc': <module '_collections_abc' from 'E:\\software\\python3\\lib\\_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'E:\\software\\python3\\lib\\_sitebuiltins.py'>, 'sysconfig': <module 'sysconfig' from 'E:\\software\\python3\\lib\\sysconfig.py'>, 'atexit': <module 'atexit' (built-in)>} >>> sys.exit()sys模組常見的使用方法
argv的應用:
import sys # 原始檔為python直譯器第二個引數 src_file = sys.argv[1] # 目的檔案問傳入的第三個引數 dst_file = sys.argv[2] with open(src_file, 'rb') as read_f, open(dst_file, 'wb') as write_f: for line in read_f: write_f.write(line) # 在終端中 執行當前檔案 # C:\Users\Administrator>python H:\python_study\day20\內容回顧.py H:\python_study\day20\test2.py H:\python_study\day20\test22.pycopy檔案時當做引數使用
sys的應用(進度條)
import sys import time def progress(percent, width=50): # 當百分比大於1的時候都按照1來顯示 if percent >= 1: percent = 1 # '[%%-%ds]' % width ====> %-50s # 然後通過格式化得到我們想要的值 show_str = ('[%%-%ds]' % width) % ('#' * int((width * percent))) # 最後列印的時候加上百分比 print('{show_str} {percent}%'.format( show_str=show_str, percent=int(percent * 100) )) # 模擬下載資料資料大小為1024567 data_size = 1024567 recv_size = 0 while recv_size < data_size: # 模擬資料延遲0.1秒 time.sleep(0.1) # 每次下載1024 recv_size += 1024 # 得到百分比列印 percent = recv_size / data_size progress(percent)模擬下載資料顯示列印條
模組四:random
import random random.random() # 得到一個(0-1)之間的浮點數 random.uniform(1, 3) # 得到一個(1, 3)之間的一個小數 random.randint(1, 3) # 得到一個[1, 3]之間的整數 random.randrange(1, 3) # 得到一個[1, 3)之間的一個整數 random.choice([1, '23', [4, 5]]) # 獲得列表中的一個值 random.choices([1, '23', [4, 5]], k=2) # 獲得列表中的兩個值返回一個列表 random.sample([1, '23', [4, 5]], k=2) # 列表元素任意2個組合 # 打亂順序 l = [1,2,3,4,5] random.shuffle(l) # 傳遞的必須是一個列表 print(l)
生成一個隨機驗證碼:
# 驗證碼包含數字和字母 def get_auth_code(num): temp_list = [] while num: num -= 1 # 首先獲得數字 a = str(random.randint(0, 10)) # 其次獲得字元 b = chr(random.randint(0, 120)) # 新增到列表中 temp_list.append(random.choice([a, b])) return temp_list print(' '.join(get_auth_code(4)))隨機驗證碼的生成
模組五: shutil
''' shutil 高階的檔案,資料夾,壓縮包處理模組 檔案處理: shutil.copyfileobj 傳入的是兩個物件,原始檔,目的檔案 shutil.copyfile 傳入的是兩個路徑,原路徑,目的路徑 shutil.copymode 只複製檔案的許可權,目的恩瑾可定是要存在 shutil.copystat 只複製檔案的狀態資訊,修改時間,檢視時間,更改時間,flag是 shutil.copy 拷貝檔案和許可權 shutil.copy2 拷貝檔案和狀態資訊 shutil.move() 更改檔名稱 資料夾處理 shutil.copytree 拷貝目錄 shutil.ignore_patterns 根據這個模組去設定是否不拷貝某個型別的檔案 shutil.rmtree 刪除目錄 壓縮包處理 shutil.make_archive() 壓縮後的目錄名稱,格式,源目錄 shutile.unpack_archive() 壓縮後的目錄名稱, 格式,解壓後的目錄 tarfile.open().add() zipfile.ZipFile().write() '''
檔案的操作:
方法1: copyfileobj:
# 方法copyfileobj # 我們要首先得到兩個開啟的檔案物件 # src就是原始檔物件 # dst目標檔案物件 src = open('sys模組.py', 'rb') dst = open('sys模組2.py', 'wb') shutil.copyfileobj(src, dst) src.close() dst.close()
方法2: copyfile
# 和方法1類似,只不過它傳遞的是路徑,而方法1傳遞的是物件# 拷貝一個檔案,而不是一個物件,目標檔案可以不存在 shutil.copyfile('sys模組.py', 'sys模組3.py')
方法3:copymode
# 拷貝原始檔的許可權,在linux下面就是xrw之類的 # 但是它的內容,使用者,組都是不變的 shutil.copymode('sys模組.py', 'sys模組2.py') # 目標檔案必須要存在
方法4: copystat
# 拷貝原始檔的狀態資訊 # 包括許可權,檢視時間,修改時間,flags等 shutil.copystat('sys模組.py', 'sys模組2.py')
方法5: copy2和copy
# 拷貝的是檔案的內容和許可權 shutil.copy('sys模組.py', 'sys模組4.py') # 拷貝的是檔案的內容和狀態 shutil.copy2('sys模組.py', 'sys模組5.py')
資料夾操作:
方法1:copytree
# 拷貝一個目錄,目標目錄不能存在,而且還要對其父目錄可以有寫許可權 # symlinks 代表的是軟連線,就相當於是一個快捷方式 # shutil.ignore_patterns拷貝的時候把符合模式的給刪除掉就是了 shutil.ignore_patterns() shutil.copytree(r'..\day20', 'forlder3', ignore=shutil.ignore_patterns('*pyc','tmp*'), symlinks=True )
方法2:rmtree
# 遞迴的刪除一個資料夾 shutil.rmtree('forlder2')
方法3:move
# 就像是linux下面的重新命名mv命令 # 引數一為原始檔名,引數二為目標檔名 shutil.move('forlder3', 'forlder2')
壓縮資料夾
方法1: make_archive
# 引數一:壓縮之後的名字 # 引數二: 以什麼樣的格式壓縮,可以是zip,tar,bztar, gztar # 引數三: 要壓縮的目錄 ''' owner: 使用者,預設當前使用者 group: 組,預設當前組 logger: 用於記錄日誌,通常是logging.Logger物件 ''' shutil.make_archive('forlder2', 'zip', root_dir='../day20')
解壓檔案
方法1:unpack_archive
# 先打包一份zip的檔案 shutil.make_archive('day19', 'zip', root_dir='..\day19') # 解壓檔案,要加上字尾名稱 # 引數一: 解壓的檔案 # format: 解壓的格式 # extract_dir: 解壓的目錄 shutil.unpack_archive('day19.zip', format='zip',extract_dir='hello')
方法2:tarfile模組
import tarfile # 壓縮 t = tarfile.open('day.tar', mode='w') t.add('sys模組.py') t.add('sys模組2.py') t.add('sys模組3.py') t.close() # 解壓 t = tarfile.open('day.tar', mode='r') t.extractall('./day') t.close()
方法3: zipfile模組
import zipfile # 壓縮 # 首先得到一個zipfile的物件,然後通過write壓縮排物件中 z = zipfile.ZipFile('day.zip', mode='w') z.write('sys模組.py') z.write('sys模組2.py') z.write('sys模組3.py') z.close() # 解壓 # 也是先得到物件,然後通過extractall獲得物件 z = zipfile.ZipFile('day.zip', mode='r') z.extractall(path='./day') z.close()
模組六:os模組
''' os模組: 指的是和作業系統相關的模組 1. 目錄操作 增 os.mkdir 建立一個單級目錄 os.makedirs 建立多級目錄,遞迴建立 刪 os.rmdir 刪除一個目錄 os.removedirs 遞迴刪除目錄,如果目錄為空 改 chdir 改變當前目錄 pardir 當前執行目錄的父目錄 curdir 當前執行檔案的目錄 查 getcwd() 獲得當前直譯器執行檔案目錄 listdir() 以列表的形式返回當前目錄下面有什麼內容 2. 檔案操作 刪 os.remove() 刪除檔案 改 os.rename() 修改檔名稱 查 os.stat 檢視當前檔案的狀態資訊 os.path.getsize() 檢視當前檔案的大小 os.path.getatime() 檢視當前檔案的建立時間 os.path.getmtime() 檢視當前檔案的修改時間 3. 變數資訊 os.stat # 檔案的狀態資訊 os.name # win是‘nt’, linux平臺是'posix' os.sep # 作業系統特定的路徑分隔符 os.linesep # 換行符win為'\t\n', linux為'\t' os.pathsep # 分割檔案路徑的字串win為;, linux為: os.environ # 系統環境變數 os.system() # 執行shell命令,直接顯示 4. 路徑的判斷 os.path.exists() # 判斷路徑是否存在 os.path.isfile() # 判斷是否是個檔案 os.path.isdir() # 判斷是否是個目錄 os.path.join() # 拼接路徑 5. 路徑操作 os.path.split() # 以列表的形式返回檔名和目錄 os.path.basename # 獲得得就是split的檔名 os.path.dirname # 獲得得就是split的目錄 5. 規範化路徑 os.path.normcase() # 將大寫變小寫,並將所有斜槓轉成反斜槓(返回的是原字串) os.path.normpath() # 會把反斜槓轉換成斜槓,然後可以識別相對路徑 os.path.abspath() # 返回path規範化的絕對路徑 '''
# 一般路徑的處理使用這種方式 import os, sys TOP_DIR = os.path.normpath(os.path.join( os.path.abspath(__file__), os.pardir, )) print(TOP_DIR) # 不建議使用下面這種方式 TOP_DIR = os.path.dirname(os.path.dirname(__file__))
在Linux和Mac平臺上,該函式會原樣返回path,在windows平臺上會將路徑中所有字元轉換為小寫,並將所有斜槓轉換為飯斜槓。 >>> os.path.normcase('c:/windows\\system32\\') 'c:\\windows\\system32\\' 規範化路徑,如..和/ >>> os.path.normpath('c://windows\\System32\\../Temp/') 'c:\\windows\\Temp' >>> a='/Users/jieli/test1/\\\a1/\\\\aa.py/../..' >>> print(os.path.normpath(a)) /Users/jieli/test1