# 第四天 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')
```