# 第四天 Python入門實作班上課記錄 ###### tags: `python` ## SFTP操作 ```python= import pysftp host = '????????' # 要連線的SFTP站台 account = '?????????' # 帳號 password = '??????' # 密碼 cnopts = pysftp.CnOpts(knownhosts='known_hosts') # 連線時憑證相關設定的物件 hostkeys = None # 本地端無憑證 # 處理憑證 if cnopts.hostkeys.lookup(host) == None: print('發現新的SFTP站台, 將允許該站台憑證') # 將新的憑證存到變數 hostkeys = cnopts.hostkeys # 將憑證檢查暫時關閉,避免第一次無法連線 cnopts.hostkeys = None with pysftp.Connection(host, username=account, password=password, cnopts=cnopts) as sftp: # 加入新的憑證 if hostkeys != None: print('連線到該新的SFTP站台並儲存該站台憑證') hostkeys.add(host, sftp.remote_server_key.get_name(), sftp.remote_server_key) hostkeys.save(pysftp.helpers.known_hosts()) print('連線成功') print(sftp.pwd) if not sftp.exists('aaron-python'): sftp.mkdir('aaron-python') print(sftp.listdir()) directory = sftp.listdir_attr() for attr in directory: print(attr.filename, attr, sftp.isdir(attr.filename)) sftp.get('python-topic-excel.pdf', 'a.pdf') sftp.put('a.pdf', 'aaron-test/b.pdf') sftp.cwd('aaron-test') if sftp.exists('c.txt'): sftp.remove('c.txt') print(sftp.listdir()) print(sftp.pwd) ``` **說明:** 1. 如果處現下面錯誤: ``` FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\{你的帳號名稱}\\.ssh\\known_hosts' ``` 即表示目前電腦還沒有可以存放SFTP連線時需要的憑證,下面步驟可以建立憑證存放的檔案: - 打開VSCode的終端機(快速鍵為: `Ctrl`+`Shift`+ `) - 切換到目前帳號的家目錄` ``` cd ~ ``` - 建立`.ssh`目錄 ``` mkdir .ssh ``` - 切換到`.ssh`目錄下 ``` cd .ssh ``` - 建立用來存放憑證的檔案`known_hosts` ``` echo '' > known_hosts ``` - 重新執行Python程式看看是否還有錯誤 ## Windows下的檔案操作 ```python= import os print(os.getcwd()) # print(os.path.abspath('.')) print(os.path.abspath('..')) print(os.path.abspath('a.pdf')) print(os.path.relpath('C:\\Windows')) import shutil shutil.copy('a.pdf', 'aaaa.pdf') # 複製a.pdf為aaaa.pdf shutil.copytree('aaa', 'bbb') # 複製aaa目錄以及下面的子目錄成為bbb目錄 shutil.move('bbb', 'ccc') # 將bbb檔案改名為ccc(如果bbb是目錄,則是目錄改名) shutil.rmtree('bbb') # 刪除bbb目錄和裏面的所有資料 ``` ## 自動化之排程器 #### 阻塞式排程器 ```python= import time from apscheduler.schedulers.blocking import BlockingScheduler from datetime import datetime def job1(): print(f'工作1啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job2(): print(f'工作2啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job3(): print(f'工作3啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job4(): print(f'工作4啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') scheduler = BlockingScheduler(timezone='Asia/Taipei') scheduler.add_job(job1, 'interval', minutes=1) scheduler.add_job(job2, 'interval', seconds=5) scheduler.add_job(job3, 'interval', seconds=1) scheduler.add_job(job4, 'cron', day_of_week='4', hour=15, minute=52) scheduler.start() print('scheduler started....') ``` #### 背景式排程器 ``` import time from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime def job1(): print(f'工作1啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job2(): print(f'工作2啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job3(): print(f'工作3啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') def job4(): print(f'工作4啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') # 指定時區(一定要指定,否則會失敗) scheduler = BackgroundScheduler(timezone="Asia/Shanghai") # 每1分鐘執行job1函式 scheduler.add_job(job1, 'interval', minutes=1) # 每5秒執行job2函式 scheduler.add_job(job2, 'interval', seconds=5) # 每1秒執行job3函式 scheduler.add_job(job3, 'interval', seconds=1) # 每週二到日的下午6點30分執行job4函式 scheduler.add_job(job4, 'cron', day_of_week='1-6', hour=18, minute=30) scheduler.start() print('Schedule started ...') while True: time.sleep(10) # 暫停10秒鐘 print('程式執行中.....') ``` **說明:** 阻塞式(Blocking)和背景式(Background)排程器差別為,組塞式在啟動排程器後程式就會停在啟動排程器那航程式碼,而背景式在啟動排程器後,程式會繼續往下執行,所以必須有一個無窮迴圈讓程式不要結束,否則排程器也會跟著結束執行。 ## Excel基本操作 ``` import openpyxl wb = openpyxl.load_workbook('Fstdata.xlsx') print(type(wb)) print(wb.sheetnames) print(wb.active) print(wb.active.title) wb101 = wb['101'] # 取得101這個工作表 wb101.title = '101-OK' # wb.close() wb.active.move_range('C5:D6', rows=2, cols=2, translate=False) wb.save('Fstdata2.xlsx') wb101 = wb.worksheets[0] # ---------------------------- new_wb = openpyxl.Workbook() new_wb.active.title = 'Hello' new_wb.create_sheet() new_wb.create_sheet(title='New', index=0) new_wb.copy_worksheet(new_wb.active) new_wb.remove(new_wb['New']) tab0 = new_wb.worksheets[0] tab0.title = 'Blue' tab0.sheet_properties.tabColor = '00A878' # tab0.protection.password = 'password' tab0['C5'] = 'Aaron' # 設定值 print(tab0['C5'].value) # 取值 print(tab0['C5'].column, tab0['C5'].row, tab0['C5'].coordinate) print('max_colomn:', wb.active.max_column) print('max_row:', wb.active.max_row) print(wb.active.cell(column=2, row=2).value) # 取得excel整份檔案內容 for r in range(1, wb.active.max_row + 1): for c in range(1, wb.active.max_column + 1): print(wb.active.cell(column=c, row=r).value, end='') print() # print(wb.active['5']) for cell in wb.active['C']: print(cell.value) # print(wb.active['D']) tab0.insert_rows(1, 5) # 在第1列插入一個新的空白列(第2個參數省略預設為1) tab0.delete_rows(1, tab0.max_column) print(wb.active.dimensions) new_wb.save('new.xlsx') ```