內(nèi)置模塊

下面我們來講一些內(nèi)置的模塊,即不需要下載就可以使用的模塊

一、sys

import sys
print(sys.argv[1])   #這的1就像shell 的$1
-----------
執(zhí)行了這個腳本的時候就會看到結(jié)果
In [3]: sys.version                                                      
Out[3]: '3.7.6 (default, Dec 31 2019, 14:50:39) \n[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]'

In [4]: sys.version_info          #輸出的更加的仔細(xì)易讀                                          
Out[4]: sys.version_info(major=3, minor=7, micro=6, releaselevel='final', serial=0)

二、os

1.關(guān)于目錄的一些操作

作用 寫法 例子
1 # 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 os.getcwd() >>> os.getcwd() (輸出--> ) '/root'
2 # 切換當(dāng)前腳本工作目錄;相當(dāng)于shell下cd os.chdir("/home") >>>os.chdir("./python_learning") >>> os.getcwd() '/root/python_learning'
3 # 創(chuàng)建單級目錄,相當(dāng)于 shell 中的 mkdir dirname os.mkdir('dirname') 在當(dāng)前的目錄創(chuàng)建一個目錄
4 # 遞歸創(chuàng)建目錄 os.makedirs('遞歸創(chuàng)建的目錄') >>> os.makedirs('/root/dir1/dir2')
5 # 刪除單級空目錄,若目錄非空則無法刪除,并報錯。 os.rmdir('dirname') In [6]: os.rmdir("dir1") 刪除掉當(dāng)前目錄下的dir1目錄
6 # 遞歸刪除 空 目錄 os.removedirs('dir1/dir2') In [10]: os.removedirs("dir1/dir2") --->ls: 無法訪問dir1: 沒有那個文件或目錄:
7 # 列出指定目錄下的所有文件和目錄,包括隱藏文件,并以列表方式打印 os.listdir('dirname')
8 # 1>.遞歸查找目錄下的文件和目錄,返回一個生成器對象。 #2> .生成器對象是個可迭代對象,每一層包含了三個值: os.walk('dirname') #3> 1. 當(dāng)前目錄路徑,2. 其下面的所有子目錄, 3. 其下面的所有文件

注意,那個遞歸的查找目錄的方法具體應(yīng)用如下
In [45]: a,b,c= os.walk('/tmp/a')

In [46]: a,b,c
Out[46]:
(('/tmp/a', ['b'], []),
('/tmp/a/b', ['f'], ['work.txt']),
('/tmp/a/b/f', [], []))

練習(xí):
1. 在 /tmp 目錄下,創(chuàng)建目錄  a/b/c
In [12]: os.makedirs("/tmp/a/b/c")    

In [14]: !ls /tmp/a/b                                                   
c
-------------------------------------
2.進入到 /tmp/a/b 目錄下,創(chuàng)建一個目錄 f
In [14]: !ls /tmp/a/b                                                   
c

In [15]: os.chdir("/tmp/a/b")                                           

In [16]: os.getcwd()                                                    
Out[16]: '/tmp/a/b'

In [17]: os.mkdir("f")                                                  

In [18]: !ls                                                            
c  f
-----------------------------------
3.把當(dāng)前的工作目錄寫到 f 目錄下的 work.txt 文件內(nèi)。
In [22]: f_obj=open("work.txt",'w',encoding="utf-8")                    

In [23]: f_obj.write('{}'.format(os.getcwd()))                          
Out[23]: 8

In [24]: f_obj.close()                                                  

In [25]: !cat work.txt                                                  
/tmp/a/b
-----------------------------------
4.刪除目錄 c
In [26]: os.rmdir("/tmp/a/b/c")                                         

In [27]: !ls                                                            
f  work.txt
----------------------------------
5.把 /tmp 目錄下及其子目錄下的所有文件和目錄打印到屏幕上
root,dir,file=
In [45]: for root,dir,file in os.walk('/tmp')
               print(root ,dir,file)                                       

2.對路徑的判斷

os.path.exists("路徑")
如果path存在,返回True;如果path不存在,返回False 在這里值得注意的是

import os
os.path.exists("/etc/passwd")               
#判斷路徑是否存在
print(os.path.exists("/etc/passwd"))
print(os.path.exists("etc/passwd"))#沒有寫全
#在Linux shell 中,Python會認(rèn)為: / 左邊一定是一個目錄,而不是文件
[root@localhost python_learning]# /usr/local/bin/python3 /root/python_learning/內(nèi)置模塊.py
True
False

os.path.isdir("路徑")
如果path是一個存在的目錄,則返回True。否則返回False
os.path.isfile("path")
如果path是一個存在的文件,返回True。否則返回False

In [59]: os.path.isfile("/etc/my.cnf.d/")      
Out[59]: False

In [60]: os.path.isdir("/etc/my.cnf.d/")       
Out[60]: True

os.rename("old_name", "new_name")
重命名文件名或目錄名

os.path.split("path")
將 path 分割成目錄和文件名二元組返回
os.path.abspath("path")
返回 文件 或 path 規(guī)范化的絕對路徑

import os
os.path.split("/etc/nginx/nginx.conf")
print(os.path.split("/etc/nginx/nginx.conf"))            
#不管這個文件是否存在,只進行切割,以右邊的第一個/切割,左邊為目錄,右邊為文件
print(os.path.abspath("/path/to/file"))
#查找文件的絕對路徑,然而只是一個簡單的拼接過程,不管你輸入的文件是否存在
print(os.path.abspath("./file"))
print(os.path.abspath("~/file"))
#只要識別到了/左邊有東西就會拼接到當(dāng)前目錄
print(os.path.abspath("bathe/file"))
--------
[root@localhost python_learning]# /usr/local/bin/python3 /root/python_learning/內(nèi)置模塊.py
('/etc/nginx', 'nginx.conf')
/path/to/file
/root/python_learning/file
/root/python_learning/~/file
/root/python_learning/bathe/file

os.path.dirname(path)
以 最右側(cè)的路徑分隔符為分界符把路徑分隔為兩部分, 返回第一部分,就是目錄部分。
不關(guān)心路徑是否真實存在與系統(tǒng)中

print(os.path.dirname("/path/dii"))
print(os.path.dirname("path/database"))
#只會識別到從右邊數(shù)第一個/并且把/和它右邊的去掉
------------
/path
path

os.path.join(path1[, path2[, ...]])
將多個路徑組合后返回,每個路徑之間不需要加路徑分隔符(\或者/)

>>> os.path.join('/home', 'tom', 'bin')
'/home/tom/bin'
>>> os.path.join('/home', '/tom', 'bin')
'/tom/bin'
>>>

三、時間模塊

1.time模塊

函數(shù) 作用
time() 返回當(dāng)前時間的一個時間戳。
sleep() 線程將推遲指定的時間后運行,單位為秒。其精度為亞秒級
ctime() 將一個時間戳(默認(rèn)為當(dāng)前時間)轉(zhuǎn)換成一個時間字符串。
localtime() 將一個時間戳轉(zhuǎn)化為當(dāng)前地區(qū)的一個struct_time()類型元組,未設(shè)置默認(rèn)為當(dāng)前時間。
gmtime() gmtime()與localtime類似,不過返回的UTC世界標(biāo)準(zhǔn)時間。
mktime() 將一個strut_time 轉(zhuǎn)化為時間戳。
clock() 返回的是程序進程運行時間。
asctime() 把一個代表時間的元組或者struct_time類型元組,轉(zhuǎn)換為類似Thu Mar 21 15:05:36 2019這樣的形式。
strptime(‘2011-05-05 16:37:06’, ‘%Y-%m-%d %X’) 把一個格式化時間字符串轉(zhuǎn)化為struct_time。實際上它和strftime()是逆操作。
strftime(’%Y-%m-%d %X’, (2009, 2, 17, 17, 3, 38, 1, 48, 0)) 把一個代表時間的元組或者struct_time類型元組轉(zhuǎn)化為格式化的時間字符串。

結(jié)構(gòu)化的時間(struct_time):struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,當(dāng)月中第幾周,一年中第幾天,夏令時)

time()
-----
In [80]: import time                           

In [81]: time.time()                           
Out[81]: 1578315529.3293629
*************************************
sleep
-----
In [82]: time.sleep(2)                         
*************************************
ctime
-----
In [83]: time.ctime(1845878)                   
Out[83]: 'Thu Jan 22 16:44:38 1970'
**************************
localtime
-----
In [84]: time.localtime()                      
Out[84]: time.struct_time(tm_year=2020, tm_mon=1, tm_mday=6, tm_hour=20, tm_min=59, tm_sec=46, tm_wday=0, tm_yday=6, tm_isdst=0)

屬性                            值
tm_year(年)                  比如2011 
tm_mon(月)                   1 - 12
tm_mday(日)                  1 - 31
tm_hour(時)                  0 - 23
tm_min(分)                   0 - 59
tm_sec(秒)                   0 - 61
tm_wday(weekday)             0 - 6(0表示周一)
tm_yday(一年中的第幾天)        1 - 366
tm_isdst(是否是夏令時)        默認(rèn)為 0
*************************
strftime把時間格式化
-----
In [85]: time.strftime("%Y-%m-%d %X")          
Out[85]: '2020-01-06 21:03:11'

In [86]: time.strftime("%F %T")                
Out[86]: '2020-01-06 21:03:22'

In [87]:  time.strftime("%H%M%S")              
Out[87]: '210340'
格式 含義
%a 本地(locale)簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化月份名稱
%B 本地完整月份名稱
%c 本地相應(yīng)的日期和時間表示
%d 一個月中的第幾天(01 - 31)
%H 一天中的第幾個小時(24小時制,00 - 23)
%I 第幾個小時(12小時制,01 - 12)
%j 一年中的第幾天(001 - 366)
%m 月份(01 - 12)
%M 分鐘數(shù)(00 - 59)
%p 本地am或者pm的相應(yīng)符
%S 秒(01 - 61)
%U 一年中的星期數(shù)。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數(shù)都放在第0周。
%w 一個星期中的第幾天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一為一個星期的開始。
%x 本地相應(yīng)日期
%X 本地相應(yīng)時間
%y 去掉世紀(jì)的年份(00 - 99)
%Y 完整的年份
%Z 時區(qū)的名字(如果不存在為空字符)
%% ‘%’字符
image.png
>>> import time
>>> time.time()
1576917412.379858
 
# 時間戳轉(zhuǎn)換為結(jié)構(gòu)化時間
>>> time.localtime(1576917412.379858)
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=0)
>>>
    
# 將 結(jié)構(gòu)化時間或者時間戳轉(zhuǎn)換為 格式化后的字符串時間
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1576917412.379858))
'2019-12-21 16:36:52'
>>>
# 將 字符串時間轉(zhuǎn)換為結(jié)構(gòu)化時間
>>> time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=21, tm_hour=16, tm_min=36, tm_sec=52, tm_wday=5, tm_yday=355, tm_isdst=-1)
>>>

# 將 指定的字符串時間轉(zhuǎn)換為時間戳
>>> time.mktime(time.strptime('2019-12-21 16:36:52', '%Y-%m-%d %H:%M:%S'))
1576917412.0

2.datetime模塊

2.1datatime.datetime
函數(shù) 作用 返回值
datetime.datetime.now(): 返回系統(tǒng)當(dāng)前時間 datetime.datetime(2020, 1, 6, 21, 21, 33, 644208)
datetime.datetime.now().date(): 返回當(dāng)前時間的日期 datetime.datetime(2020, 1, 6)
datetime.datetime.now().time(): 返回當(dāng)前時間的時分秒 datetime.datetime(21, 25, 26, 653024)
datetime.datetime.ctime(): 將datetime.datetime類型轉(zhuǎn)化成str類型
datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'): 時間格式轉(zhuǎn)化成字符串: 返回時間的字符串 '2020-01-06 21:29:58'
datetime.datetime.strptime('2018-11-09 14:42:36','%Y-%m-%d %H:%M:%S'): 字符串轉(zhuǎn)化成時間格式 返回datetime.datetime類型的時間 datetime.datetime(2018, 11, 9, 14, 42, 36)

設(shè)計一個定時

nowtime = datetime.datetime.now()
restime = datetime.datetime.strptime("2019-09-05 12:00:00",'%Y-%m-%d %H:%M:%S')
restime - nowtime
t = restime - nowtime
print(str(t))

t.days

h,s = divmod(t.seconds, 3600)
m,s =divmod(s,60)

f"{t.days}天{h}小時{m}分{s}秒"

divmod() 函數(shù)把除數(shù)和余數(shù)運算結(jié)果結(jié)合起來,返回一個包含商和余數(shù)的元組(a // b, a % b)。

那么可以得到交互式是定時

import datetime

def handle_seconds(second):
    t = datetime.timedelta(seconds=second)

    # 計算多少小時,多少秒
    # 一個小時 3600 秒,這里divmod 內(nèi)置函數(shù)取商數(shù)和余數(shù)
    h,s = divmod(t.seconds, 3600)

    # 計算多少分鐘和多少秒
    m,s =divmod(s,60)

    if t.days > 0 :
        tpl = "{days}天{h}小時{m}分{s}秒"
        msg = tpl.format(days=t.days, h=h, m=m, s=s)
    elif t.days == 0 and h > 0:
        tpl = "{h}小時{m}分{s}秒"
        msg = tpl.format(h=h, m=m, s=s)
    elif h == 0 and m > 0:
        tpl = "{m}分{s}秒"
        msg = tpl.format(m=m, s=s)
    elif m == 0 and s > 0:
        tpl = "{s}秒"
        msg = tpl.format(s=s)
    else:
        msg = "剛剛"
    print(msg)
2.2datetime.timedelta

Python datetime之timedelta
該函數(shù)表示兩個時間的間隔
參數(shù)可選、默認(rèn)值都為0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

比如要輸出當(dāng)前時間一小時之后的時間:

from datetime import datetime,timedelta

time1 = datetime.now()

print time1
print time1.strftime("%y-%m-%d %H:%M:%S")
print (time1+timedelta(hours =1)).strftime("%y-%m-%d %H:%M:%S")
輸出的時間比上面的的那個少了1小時

四、壓縮打包模塊shutil模塊

文件 文件夾 壓縮包 處理模塊
1.copyfile('被拷貝的文件','拷貝的文件')
拷貝文件的內(nèi)容到另一個文件中,參數(shù)是文件的相對路徑或者絕對路徑

import shutil
shutil.copyfile('./src.file','./dst.file')

2.copy2('被拷貝的文件','拷貝的文件')
拷貝文件和權(quán)限
3.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件夾

ignore=shutil.ignore_patterns('排除的文件名', '排除的文件夾名') 支持通配符,假如有多個用逗號隔開
shutil.ignore_patterns(*patterns) 忽略某些文件

shutil.copytree('/home','/tmp/hbak',
                ignore=shutil.ignore_patterns('*.txt'))
# 遞歸拷貝一個文件夾下的所有內(nèi)容到另一個目錄下,目標(biāo)目錄應(yīng)該是原來系統(tǒng)中不存在的

4.shutil.rmtree('/tmp/hb')
遞歸刪除一個文件夾下的所有內(nèi)容

# 最后結(jié)尾的一定是明確的文件名,不可以類似下面這樣
shutil.rmtree('/tmp/hbak/*')

5.shutil.move('/home/src.file', './shark')
遞歸的去移動文件,它類似mv命令。

6.shutil.make_archive('shark', # 壓縮后文件名 'gztar', # 指定的壓縮格式 '/home/shark/') # 被壓縮的文件夾名字

# 將 /home/shark 目錄下的所以文件打包壓縮到 /tmp 目錄下,名字shark,格式 tar
shutil.make_archive( '/tmp/shark','tar','/home/shark/')

# 查看當(dāng)前 python 環(huán)境下支持的壓縮格式
ret = shutil.get_archive_formats()
print(ret)

7.shutil.unpack_archive('./a/b.tar.gz' #解壓的文件名 , './a/c/' #解壓到哪個路徑下,'gztar' #壓縮的格式)
解壓縮

五、subprocess

subprocess 是開啟一個系統(tǒng)基本的單個進程,執(zhí)行 shell 命令,可以得到命令的執(zhí)行結(jié)果。

In [21]: subprocess.getoutput('ls')                                                            
Out[21]: 'bin\ncreate.py\nlib\npackage\npage\n__pycache__\nPython-3.7.3\nPython-3.7.3.tgz\ntest.py\ntests.py\n參數(shù).py\n操作redis.py\n調(diào)試mysql.py\n調(diào)試代碼.py\n內(nèi)置模塊.py'

In [22]: ret = subprocess.getstatusoutput('ls')                                                

In [23]: ret = subprocess.getstatusoutput('date -u')            
#可以看看有沒有執(zhí)行成功,                                

In [24]: ret                                                                                   
Out[24]: (0, '2020年 01月 06日 星期一 06:28:44 UTC')
#執(zhí)行成功會在前面有一個$?的返回
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容