sorted()
函數對全部可迭代的對象進行排序操做。python
sort 與 sorted 區別:
sort 是應用在 list 上的方法,sorted 能夠對全部可迭代的對象進行排序操做。shell
list 的 sort 方法返回的是對已經存在的列表進行操做,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操做。vim
''' 員工角色: 行政 工做內容: 作員工調查問卷 工做流程: 給每一個員工發送統-的問卷的模板 要求: 員工按照提供的固定模板,填寫調查問卷,而且發送給行政人員 行政人員可能會受到多份格式相同而內容不一樣的Excel文件 處理Excel文件:手工合併多個文件內容, 比較常見的方法: 以某個文件(result.xlsx)的內容爲基礎,打開別的文件,複製其中須要的數據,粘貼到result.xlsx ''' import os import glob import openpyxl # 定義函數,獲取指定目錄下的全部Excel文檔 def get_all_xlsx_files(path): xlsx_files = glob.glob(os.path.join(path,'*.xlsx')) sorted(xlsx_files, key=str.lower) return xlsx_files # 合併Excel文檔的方法 def merge_xlsx_files(xlsx_files): wb = openpyxl.load_workbook(xlsx_files[0]) ws = wb["Sheet1"] # 已排序後的Excel文件的第一 順序的文檔做爲基礎,讀取其餘文檔內容 for filename in xlsx_files[1:]: workbook = openpyxl.load_workbook(filename) worksheet = workbook["Sheet1"] # 從工做表的第二行開始讀取,第一行是表頭,不讀取。 for row in worksheet.iter_rows(min_row=2): values = [cell.value for cell in row] # 將讀取到的單元格內容追加到第一順序的Excel文檔指定的sheet內容後面 ws.append(values) return wb def main(): xlsx_files = get_all_xlsx_files(os.path.basename(".")) wb = merge_xlsx_files(xlsx_files) wb.save('result.xlsx') if __name__ == '__main__': main() # 獲取指定目錄下的全部Excel文檔 # xlsx_file = get_all_xlsx_files('.')
都合併到一塊兒了bash
import smtplib # 鏈接SMTP服務器 smtp = smtplib.SMTP('smtp.qq.com',25) # 發送SMTP的"Hello"消息 print(smtp.ehlo()) #不加密 print(smtp.starttls()) #加密 # 登陸到SMTP服務器 print(smtp.login('2877364346@qq.com','gengfveyokhfdffe')) #綁定受權碼 # 發送電子郵件 smtp.send(發件人,收件人,郵件內容) print(smtp.sendmail('2877364346@qq.com','3552422607@qq.com','Subject:this is title\nthis is content')) # 關閉SMTP服務器的鏈接 smtp.quit() print('退出鏈接')
#不加密 (250, b'newxmesmtplogicsvrsza5.qq.com\nPIPELINING\nSIZE 73400320\nSTARTTLS\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME') #加密 (220, b'Ready to start TLS from 113.25.19.201 to newxmesmtplogicsvrsza5.qq.com.') #綁定受權碼成功 (235, b'Authentication successful') # 發送電子郵件成功 {} 退出鏈接
'''發送純文本郵件''' from __future__ import print_function import smtplib from email.mime.text import MIMEText SMTP_SERVER = 'smtp.qq.com' SMTP_PORT = 25 # 定義發送郵件的方法 def send_mail(user,pwd,to,subject,text): # 構建MIMEText郵件對象(純文本) msg = MIMEText(text) msg['From'] = user msg['To'] = to msg['Subject'] = subject # 鏈接SMTP服務器 smtp = smtplib.SMTP(SMTP_SERVER,SMTP_PORT) print("郵件服務器已鏈接") try: smtp.ehlo() print('和服務器打招呼。。。') smtp.starttls() print('加密傳輸!') smtp.ehlo() print('再次打招呼。。。') smtp.login(user,pwd) print('登錄服務器') smtp.sendmail(user,to,msg.as_string()) print('郵件已發送。。。') except Exception as err: raise SystemExit('郵件發送失敗:{0}'.format(err)) finally: smtp.quit() def main(): send_mail('2877364346@qq.com','gengfveyokhfdffe','3552422607@qq.com','這是一封測試郵件','你好xgp!') if __name__ == '__main__': main()
郵件服務器已鏈接 和服務器打招呼。。。 加密傳輸! 再次打招呼。。。 登錄服務器 郵件已發送。。。
發送帶附件的郵件,首先要建立MIMEMultipart()實例,而後構造附件,若是有多個附件,可依次構造,最後利用smtplib.smtp發送。服務器
import yagmail yag = yagmail.SMTP(user='2877364346@qq.com', password='gengfveyokhfdffexgp', host='smtp.qq.com', port=465) content = ['yagmail測試郵件內容', '1000263.jpg'] yag.send('3552422607@qq.com', 'this is from yagmailtest email.', content)
在這一小節中,咱們將會學習如何在shell腳本中調用ping命令獲得網絡上活躍的主機列表,隨後,咱們使用Python語言改造這個程序,以此支持併發的判斷。網絡
-bash-4.2# vim ips.txt # 本機ip 192.168.1.80 # 本機 127.0.0.1 # 不可達的地址 192.168.2.2
-bash-4.2# vim ping.sh #/usr/bin/bash for ip in $(cat ips.txt) do if ping $ip -c 2 &>/dev/null then echo "$ip 是活躍的。" else echo "$ip 是不可達的。" fi done
-bash-4.2# sh ping.sh 192.168.1.80 是活躍的。 127.0.0.1 是活躍的。 192.168.2.2 是不可達的。
Python中使用線程有兩種方式:函數或者用類來包裝線程對象。多線程
函數式:調用thread模塊中的start_new_thread()函數來產生新線程。語法以下:併發
thread.start_new_thread ( function, args[, kwargs] )
Python經過兩個標準庫thread和threading提供對線程的支持。thread提供了低級別的、原始的線程以及一個簡單的鎖。app
#!/usr/bin/python3 # encodig=utf-8 import os import threading def ping(ip): '''測試網卡的連通性''' res = os.system(u'ping -c 2 '+ip) if res == 0: print('網卡正常!') else: print('網卡異常!') return res def main(): with open('ips.txt') as f: # 使用多線程 threads = [] lines = f.readlines() for line in lines: thread = threading.Thread(target=ping, args=(line,)) thread.start() threads.append(thread) for thr in threads: thr.join() if __name__ == '__main__': main()
在Linux下,能夠便用ping命令要判斷一臺主機是否可達。而判斷一個端口是否打開可使用telnet命令。 咱們能夠模仿前面小節中並行ping的例子,在Python代碼中調用telnet命令判斷一個端口是否打開。可是telnet命令存在一個問題,當咱們telnet一個不可達的端口時,telnet須要好久才 可以超時返回,井且telnet命令沒有參數控制超時時間。此外, 若是Python標準庫中有相應的模塊,應該儘量地使用Python的標準庫,而不是在Python代碼中執行Linux命令。這一方面可以增長代碼的可讀性、可維護性.另外一方面也可以保證程序跨平臺運行。socket
爲了使用Python編寫端口掃描器,咱們須要簡單瞭解socket模塊。socket模塊爲操做系統的socket鏈接提供了一個Python接口,有了socket模塊,咱們能夠完成任何使用socket的任務。
-bash-4.2# yum -y install telnet
-bash-4.2# telnet 192.168.1.80 22 #測試鏈接,本機的22端口 Trying 192.168.1.80... Connected to 192.168.1.80. Escape character is '^]'. SSH-2.0-OpenSSH_6.6.1 exit #退出鏈接
socket模塊提供了一個工廠函數socket, socket函數會返向一個socket對象。咱們能夠給socket函數傳遞參數,以此建立不一樣網絡協議和網絡類塑的socket對象。默認狀況下,socket函數會返回一個使用TCP協議的socket對象。
Socket又稱"套接字",應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間能夠通信。
Python 中,咱們用 socket()函數來建立套接字,語法格式以下:
socket.socket([family[, type[, proto]]])
SOCK_STREAM
或SOCK_DGRAM
-bash-4.2# ipython Python 3.8.1 (default, Mar 9 2020, 12:35:12) Type 'copyright', 'credits' or 'license' for more information IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: import socket In [2]: s = socket.socket() In [4]: s.connect(('47.100.98.242',80)) In [6]: s.send("GET/HTTP/1.0".encode()) Out[6]: 12 In [7]: print(s.recv(200)) b'' In [8]: s.close Out[8]: <bound method socket.close of <socket.socket fd=13, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.80', 42550), raddr=('47.100.98.242', 80)>>
在這個例子中, socketI廠函數以默認參數AF. INET和SOCK STREAM建立了一個名爲s的socket對象,該對象能夠在進程間進行TCP通訊。建立完對象之後,咱們使用connect函數鏈接到遠程服務器的80端口,併發送一個HTTP請求到遠程服務器,發送完畢以後,接收服務器響應的前200個字節。最後,調用socket對象的close方法關閉鏈接。
在這個例子中,咱們用到了socket工廠函數、socket的connect方法、 send方法、recv 方法和close方法,這也是socket中最常使用的一些方法。
import socket s = socket. socket() s. connect(( '47.100.98.242' ,80)) s.send( ' http:/ /www.baidu.com/'.encode()) print(s.recv(10)) s.close()
b'HTTP/1.1 4'
#!/usr/bin/python3 # encoding=utf-8 from socket import * def conn_scan(host, port): conn = socket(AF_INET, SOCK_STREAM) try: conn.connect((host, port)) print(host, port, '已鏈接') except Exception as e: print(host, port, '鏈接失敗') finally: conn.close() def main(): host = '47.100.98.242' for port in range(20, 5000): conn_scan(host, port) if __name__ == '__main__': main()
47.100.98.242 20 鏈接失敗 47.100.98.242 21 已鏈接 47.100.98.242 22 已鏈接 47.100.98.242 23 鏈接失敗 47.100.98.242 24 鏈接失敗
#encoding=utf-8 import telnetlib def conn_scan(host, port): t = telnetlib.Telnet() try: t.open(host, port, timeout=1) print(host, port, '已鏈接') except Exception as e: print(host, port, '鏈接失敗') finally: t.close() def main(): host = '47.100.98.242' for port in range(20, 26): conn_scan(host, port) if __name__ == '__main__': main()
47.100.98.242 20 鏈接失敗 47.100.98.242 21 已鏈接 47.100.98.242 22 已鏈接 47.100.98.242 23 鏈接失敗