1. 程式人生 > >第20天 內建模組一

第20天 內建模組一

人生三問

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.py
copy檔案時當做引數使用

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