下面我們來講一些內(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ū)的名字(如果不存在為空字符) |
| %% | ‘%’字符 |

>>> 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í)行成功會在前面有一個$?的返回