一、時間模塊 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()) #改變當前腳本工作目錄;相當於shell下cd print(os.curdir) #返回當前目錄: ('.') os.pardir #獲取當前目錄的上一個目錄:('..') os.makedirs('dirname1/dirname2') #遞歸創建目錄,相當於linux下的 "mkdir -p" os.removedirs('dirname1') #遞歸的刪除目錄 os.mkdir('dirname') #在當前目錄下創建目錄 os.rmdir('dirname') #刪除單級空目錄,若目錄不爲空則無法刪除,報錯;相當於shell中rmdir 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 K8.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')) # windows爲gbk編碼,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()