Pyrhon 模塊使用

一、時間模塊 time

 1.1、初識時間模塊,時間的三種格式(重點)

import time

#第一種時間格式:
print(time.time())
>>1527000352.3488626 linux 元年時間到當前時間,一共有多少秒

#第二種時間格式:
print(time.strftime("%Y-%m-%d %X"))
>>:格式化的時間字符串:'2018-05-22 22:47:41'
# %Y:年,%m:月,%d:日,%X:當前時間(::)的格式,%X==%H:%M:%S

#第三種時間格式:struct_time(結構化時間)
print(time.localtime()) #時間對象(把一個完整的時間拆分成一個個小的部分,方便單獨取值)
>>time.struct_time(tm_year=2018, tm_mon=5, tm_mday=22, tm_hour=22, tm_min=52, tm_sec=26, tm_wday=1, tm_yday=142, tm_isdst=0)
print(time.localtime().tm_year)    #取時間對象內的參數(tm_year)得到對應的值()
>>2018
print(time.localtime().tm_mon)     #取時間對象內的參數(tm_mon)得到對應的值()
>>5
print(time.localtime().tm_mday)    #取時間對象內的參數(tm_mday)得到對應的值()
>>22
print(time.localtime().tm_hour)    #取時間對象內的參數(tm_hour)得到對應的值(時象)
>>23

print(time.gmtime())    #GMT時區(世界標準時間)的時間對象
>>time.struct_time(tm_year=2018, tm_mon=5, tm_mday=22, tm_hour=15, tm_min=0, tm_sec=29, tm_wday=1, tm_yday=142, tm_isdst=0)
#time.localtime()是一樣的,只不過它取得時間爲GMT時區的時間


 1.2、時間之間的轉換關係(瞭解)



import time
# 一、時間戳轉換成結構化時間
print(time.localtime(123123))
>>time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=18, tm_min=12, tm_sec=3, tm_wday=4, tm_yday=2, tm_isdst=0)

print(time.gmtime(123123))
>>time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=12, tm_sec=3, tm_wday=4, tm_yday=2, tm_isdst=0)

# 二、結構化時間轉換成時間戳
print(time.mktime(time.localtime()))
>>1527002000.0

#三、結構化的時間轉換成字符串的形式
print(time.strftime('%Y-%m-%d',time.localtime()))
>>2018-05-22

#四、把格式化的字符串時間轉換成結構化時間
print(time.strptime('2017-05-22','%Y-%m-%d'))
>>time.struct_time(tm_year=2017, tm_mon=5, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=142, tm_isdst=-1)

#五、其他格式時間
time.sleep(3)    #等待3秒在執行

print(time.asctime(time.localtime()))   #linux服務器時間格式(轉換本地時間)
>>Tue May 22 23:27:21 2018

print(time.ctime(123123))     #時間戳形式
>>Fri Jan  2 18:12:03 1970

二、時間模塊 datatime

2.1、datatime使用

import datetime
print(datetime.datetime.now())   #打印當前時間
# >>2018-05-22 23:33:57.233285

print(datetime.datetime.now().replace(year=1999,hour=3))  #把當前時間的""替換成了1999,"小時"替換成了3
# >>1999-05-23 03:08:38.648744

print(datetime.datetime.fromtimestamp(123123))   #打印時間戳
# >>1970-01-02 18:12:03

print(datetime.datetime.now() + datetime.timedelta(days=3))   #打印三天後的當前時間
# >>2018-05-26 00:04:05.001374
print(datetime.datetime.now() + datetime.timedelta(days=-3))   #打印三天前的當前時間

print(datetime.datetime.now() + datetime.timedelta(weeks=3))   #打印三週後的當前時間
# >>2018-06-13 00:04:45.468382
print(datetime.datetime.now() + datetime.timedelta(weeks=-3))   #打印三週前的當前時間
# >>2018-05-02 00:05:37.230676

三、隨機模塊random

    3.1、隨機模塊random重點掌握

import random
print(random.randint(1,3))  #隨機取1~3任意一個爲整數的值
>>3

print(random.choice([1,'a',2,'b']))   #隨機取列表中的某1個值
>>2


    3.2、隨機模塊random瞭解知識點

import random
print(random.random())      #取一個隨機數
>>0.4627305393531762

print(random.sample([1,'a',2,'b'],2))   #隨機取列表中的某2個值
>>['b', 'a']

print(random.uniform(1,3))   #1~3之間隨機的小數
>>2.597815832594728

l=[1,3,4,5,6]
random.shuffle(l)      #打亂列表l裏面值得順序
print(l)
>>[4, 6, 5, 1, 3]

四、os模塊

import os
print(os.getcwd())         #獲取當前工作目錄,即當前python腳本工作的目錄路徑,相當於Linux下的"pwd"
print(os.chdir())          #改變當前腳本工作目錄;相當於shellcd
print(os.curdir)           #返回當前目錄: ('.')
os.pardir                  #獲取當前目錄的上一個目錄:('..')
os.makedirs('dirname1/dirname2')    #遞歸創建目錄,相當於linux下的 "mkdir -p"
os.removedirs('dirname1')    #遞歸的刪除目錄
os.mkdir('dirname')          #在當前目錄下創建目錄
os.rmdir('dirname')          #刪除單級空目錄,若目錄不爲空則無法刪除,報錯;相當於shellrmdir dirname
os.listdir('.')              #列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印
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.environ                #獲取系統環境變量
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的大小


    4.1、os模塊幾個要記住的用法

    1.打印當前目錄下所有的文件

import os
print(os.listdir(r'.'))   #打印當前目錄下的所有文件
>>['test.txt', 'test.xml', 'test.xml.swap', '第七節課.py']

    2.使用os.system可以執行系統命令

import os
os.system('ipconfig')    #使用os.system執行系統命令,把執行命令後的結果輸出到屏幕

res=os.system('ipconfig')  #把命令執行的結果賦值給res,類似linux下的"echo "$?" "
print(res)
# >>0       #返回"0"表示命令執行成功
# >>1       #返回"1"表示命令執行失敗

    使用os.system執行系統命令,把執行命令後的結果輸出到屏幕,雖然可以通過賦值操作給一個變量值,但是隻能拿到'0'和'1',而不能拿到執行命令後的結果,這裏可以通過(suprocess模塊)實現。


    3、打印當前文件的絕對路徑

import os
res=os.path.join(
    os.path.abspath(__file__),   #獲取當前文件名
    '..',                        #獲取上一級目錄".."
    '..'                         #獲取上一級目錄".."
)
print(os.path.normpath(res))     #使用os.path.normpath,得到當前文件的絕路徑(根路徑)
>>C:\Users\stsud\Desktop\Pycharm文檔

五、sys模塊

import sys

print(sys.argv)
>>['C:/Users/stsud/Desktop/Pycharm文檔/第七次課/第七節課.py']

sys.exit(0)   #退出程序,正常退出時exit(0)

print(sys.version)   #查看Python解釋器的版本信息
>>3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]

print(sys.path)     #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
>>['C:\\Users\\stsud\\Desktop\\Pycharm文檔\\第七次課', 'C:\\Users\\stsud\\Desktop\\Pycharm文檔', 'C:\\Install Path\\Python3.6\\python36.zip', 'C:\\Install Path\\Python3.6\\DLLs', 'C:\\Install Path\\Python3.6\\lib', 'C:\\Install Path\\Python3.6', 'C:\\Install Path\\Python3.6\\lib\\site-packages', 'C:\\Install Path\\Python3.6\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'C:\\Install Path\\Pycharm-破解版\\PyCharm 2018.1\\helpers\\pycharm_matplotlib_backend']

print(sys.platform)   #返回操作系統平臺名稱
>>win32

    5.1、利用sys模塊打印進度條:基礎進階

#進度條功能:手動麪條版
import sys,time
print('\r[#####]',end='')             #"\r"表示每次打印的內容都從第一行開始(相當於第二次打印的內容會覆蓋掉第一次打印的內容)
time.sleep(1)
print('\r[######]',end='')             #"\r"表示每次打印的內容都從第一行開始(相當於第二次打印的內容會覆蓋掉第一次打印的內容)
time.sleep(1)
print('\r[#######]',end='')             #"\r"表示每次打印的內容都從第一行開始(相當於第二次打印的內容會覆蓋掉第一次打印的內容)
time.sleep(1)
print('\r[############]',end='')       #end='' 表示把每一行的換行符替換爲空
[######]


#進度條功能:手動麪條版-升級
import sys,time
print('[%-50s]'  %'#')       #"%-50s"其中"-50"表示左對齊,寬度爲50%s還是用來傳值的
print('[%-50s]'  %'##')
print('[%-50s]'  %(int(0.3*50)*'#'))   #(int(0.3*50)*'#'),數字與字符相乘==(15*'#')
print('[%-50s]'  %(int(1*50)*'#'))     #(int(1*50)*'#'),數字與字符相乘==(50*'#')
[#                                                 ]
[##                                                ]
[###############                                   ]
[##################################################]

print('%d%%' %30)    #2%%表示取消%的特殊意義,就只是一個普通的字符"%"
>>30%

print(('[%%-%ss]'  %50) %'#######')  #('[%%-%ss]'  %50)給傳一個值50進去後就會得到[%-50s]
>>[%-50s]

#進度條功能:綜合升級版
import sys,time
def jindutiao(precent,width=50):
    print(('\r[%%-%ss]' %width) %(int(precent * width) * '#'),end='')

total_size=102400              #下載總量
resv_size=0                    #接受量爲0
while resv_size < total_size:  #接受量小於下載總量時
    time.sleep(0.1)
    resv_size+=1024            #每次下載1024
    precent=resv_size / total_size   #已下載量除以下載總量得到一個百分比
    jindutiao(precent)                  #把得到的百分比傳到函數jindutiao裏面

    5.2、利用sys模塊打印進度條:完整功能

#進度條功能:綜合完整版
import sys,time
def jindutiao(precent,width=50):       #主體函數
    if precent>1:                #如果百分比大於100%時,把它固定死,不能超過100%
        precent=1
    show_str=('[%%-%ss]' %width) %(int(precent * width) * '#')
    print('\r%s %d%%' %(show_str,int(precent * 100)),end='')

#################################上面爲主體函數-可套用################################

#測試進度條功能
total_size=102400                #下載總量
resv_size=0                      #接受量爲0
while resv_size < total_size:    #接受量小於下載總量時
    time.sleep(0.1)
    resv_size+=1024              #每次下載1024
    precent=resv_size / total_size        #已下載量除以下載總量得到一個百分比
    jindutiao(precent)                    #把得到的百分比傳到函數jindutiao裏面

六、shutil模塊

    6.1、將文件內容拷貝到另一個文件中

import shutil
shutil.copyfileobj(open('test.txt','r'), open('new.txt', 'w'))
    原理:將test.txt以"r"只讀的模式讀出文件內容,然後以"w"寫的模式把讀出的文件內容寫到新的new.txt文件中。

    6.2、拷貝文件

import shutil
shutil.copyfile('new.txt', 'new2.txt')      #目標文件無需存在

    6.3、僅拷貝權限。內容、組、用戶均不變

import shutil
shutil.copymode('f1.log', 'f2.log')         #目標文件必須存在

    6.4、僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags

import shutil
shutil.copystat('f1.log', 'f2.log')         #目標文件必須存在
    6.5、拷貝文件和權限
import shutil
shutil.copy('f1.log', 'f2.log')
    6.6、拷貝文件和狀態信息
import shutil
shutil.copy2('f1.log', 'f2.log')
    6.7、遞歸的去拷貝文件夾
import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫權限,ignore的意思是排除 

    6.8、遞歸的去移動文件,它類似mv命令,其實就是重命名。

import shutil
shutil.move('folder1', 'folder3')


    6.9、shutil.make_archive 打包文件

import shutil
ret = shutil.make_archive("test_bak", 'gztar', root_dir=r'C:\Users\stsud\Desktop\Pycharm文檔\第七次課')
# test_bak 打包後命名爲"test_bak.tar.gz"
# gztar tar的方式打包文件
# root_dir 被打包的文件

    6.10、tarfile 解壓文件

import tarfile
f=tarfile.open('test_bak.tar.gz','r')
f.extractall(r'C:\Users\stsud\Desktop\Pycharm文檔\第八節課')
f.close()

# tarfile.open('test_bak.tar.gz','r') 'r'只讀模式打開test_bak.tar.gz文件
# f.extractall(r'C:\Users\stsud\Desktop\Pycharm文檔\第八節課') 文件解壓後存放的目錄
# f.close() 文件打開後需要被關閉

   shutil 對壓縮包的處理是調用 zipfile tarfile 兩個模塊來進行的,詳細:


    6.10.1、zipfile 模塊壓縮與解壓

import zipfile
# 壓縮
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解壓
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()

zipfile壓縮解壓縮

七、shevle 模塊 只支持Python格式的數據類型

    7.1、存文件

import shelve

f=shelve.open(r'shelve.txt')         #打開一個文件並寫入內容,並存在磁盤裏面
f['a']={'age':18,'sex':'male'}
f['b']={'age':38,'sex':'famale'}
f.close()

    7.2、取文件內容

import shelve
f=shelve.open(r'shelve.txt')         #打開一個文件並寫入內容,並存在磁盤裏面
f['a']={'age':18,'sex':'male'}
f['b']={'age':38,'sex':'famale'}

print(f['a'])    #取出'a'的所有值
>>{'age': 18, 'sex': 'male'}
print(f['b'])
>>{'age': 38, 'sex': 'famale'}

print(f['b']['age'])   #取出'a'裏面的'age'的值
>>38
print(f['b']['sex'])
>>famale

f.close()

    7.3、修改文件內容

import shelve
f=shelve.open(r'shelve.txt',writeback='True')    #要加writeback='True',表示寫回
f['a']={'age':18,'sex':'male'}
f['b']={'age':38,'sex':'famale'}

f['a']['age']=19          #修改文件內內容'age'19
print(f['a']['age'])
>>19
f.close()


八、suprocess 模塊  可執行系統命令的模塊(cmd命令)

    8.1、執行正確的命令之後的返回值給管道,通過stdout=subprocess.PIPE獲取

import subprocess
obj=subprocess.Popen(       
    'ipconfig',             # 'ipconfig' 要執行的命令
    shell=True,             # shell=True 需要調用命令解釋器來幫我執行'tasklist'這個命令
    stdout=subprocess.PIPE, # stdout=subprocess.PIPE 即管道(命令執行後結構給到管道),stdout表示輸入正確的命令得到的返回值
    stderr=subprocess.PIPE, # stderr=subprocess.PIPE # stderr表示輸入錯誤的命令得到的返回值
)

stdout=obj.stdout.read()
print(stdout.decode('gbk'))    #不加字符集得到的是二進制形式的返回值,這裏要使用操作系統所使用的字符集('gbk')

>>: 映像名稱                       PID 會話名              會話#       內存使用
>>: ========================= ======== ================ =========== ============
>>: System Idle Process              0 Services                   0          8 K
>>: System                           4 Services                   0         24 K
>>: Registry                       120 Services                   0     13,280 K
    8.2、輸入錯誤的命令之後的返回值給管道,通過stderr=subprocess.PIPE獲取

import subprocess
obj=subprocess.Popen(
    'taskliasdasdst',       # 'taskliasdasdst' 要執行的命令
    shell=True,             # shell=True 需要調用命令解釋器來幫我執行'tasklist'這個命令
    stdout=subprocess.PIPE, # stdout=subprocess.PIPE 即管道(命令執行後結構給到管道),stdout表示輸入正確的命令得到的返回值
    stderr=subprocess.PIPE, # stderr=subprocess.PIPE # stderr表示輸入錯誤的命令得到的返回值
)

stderr=obj.stderr.read()
print(stderr.decode('gbk'))

>>: 'taskliasdasdst' 不是內部或外部命令,也不是可運行的程序
>>: 或批處理文件。
    8.3、suprocess(子進程),在程序運行中,會先運行主進程,主進程可以生產一個子進程,在主進程運行的同時子進程也在運行(相當於併發執行,可提高效率,節省時間)

import subprocess
obj=subprocess.Popen(              #執行命令的過程
    'tasklist',
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)
stdout=obj.stdout.read()        #拿到執行命令得到的結果
print(stdout.decode('gbk'))

    #以上爲suprocess模塊的正常使用方法。


九、paramiko模塊  簡單執行遠程命令的用法

    9.1、基於IP和端口連接的用法

#paramiko模塊的簡單遠程執行命令:用法一
import paramiko

# 創建SSH對象--(實例化)
ssh = paramiko.SSHClient()

# 允許連接不在know_hosts文件中的主機 (連接SSH,輸入Yes/No)--固定用法
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連接服務器--指定IP,端口,用戶名和密碼
ssh.connect(hostname='192.168.200.142', port=22, username='root', password='123456')

# 執行命令 --執行"df -h"命令
stdin, stdout, stderr = ssh.exec_command('df -h')   #把執行命令得到的結果放在管道里面

# 獲取命令結果--獲取正確的結果
result = stdout.read()
print(result.decode('utf-8'))   # windowsgbk編碼,linux系統爲utf-8編碼

# 關閉連接
ssh.close()

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  1.5G  6.7G  19% /
tmpfs           497M     0  497M   0% /dev/shm
/dev/sda1       190M   35M  146M  19% /boot

#paramiko模塊的簡單遠程執行命令:用法二
import paramiko

transport = paramiko.Transport(('192.168.200.142', 22))
transport.connect(username='root', password='123456')

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df -h')
res=stdout.read()
print(res.decode('utf-8'))

transport.close()

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  1.5G  6.7G  19% /
tmpfs           497M     0  497M   0% /dev/shm
/dev/sda1       190M   35M  146M  19% /boot


    9.2、基於ssh-key祕鑰連接的用法(未測試)

import paramiko

private_key = paramiko.RSAKey.from_private_key_file('/tmp/id_rsa')

# 創建SSH對象
ssh = paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器
ssh.connect(hostname='120.92.84.249', port=22, username='root', pkey=private_key)

# 執行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 獲取命令結果
result = stdout.read()
print(result.decode('utf-8'))
# 關閉連接
ssh.close()


    9.3、SFTPClient--用於連接遠程服務器並執行上傳下載

        1.基於用戶名密碼上傳下載

import paramiko

transport = paramiko.Transport(('192.168.200.142', 22))
transport.connect(username='root', password='123456')

sftp = paramiko.SFTPClient.from_transport(transport)

# 將本地的"C:\MLBB\部署記錄\2,3,5大區分區部署.txt"文件,上傳至服務器並重命名"/root/szq_test.txt"    --這裏不單單指定上傳的目錄,必須指定上傳後的文件名
sftp.put(r'C:\MLBB\部署記錄\2,3,5大區分區部署.txt', '/root/szq_test.txt')

# 將服務器的/etc/passwd文件,下載到本地並重命名"D:\passwd"     --同樣,下載也是不單單指定下載的目錄,必須指定下載後的文件名
sftp.get('/etc/passwd', r'D:\passwd')

transport.close()

    

        2.基於公鑰密鑰上傳下載(未測試)

import paramiko

private_key = paramiko.RSAKey.from_private_key_file('/tmp/id_rsa')

transport = paramiko.Transport(('120.92.84.249', 22))
transport.connect(username='root', pkey=private_key )

sftp = paramiko.SFTPClient.from_transport(transport)
# location.py 上傳至服務器 /tmp/test.py
sftp.put('/tmp/id_rsa', '/tmp/a.txt')
# remove_path 下載到本地 local_path
sftp.get('remove_path', 'local_path')

transport.close()




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章