Python小應用
========================
## user檔案比較與更新
```python=
import os, time, sys
##批量檔案內容更新
##記得更新版本號
def fileExists(file1, file2):#確認兩檔案是否皆存在
### FileExistsError: [Errno 17] File exists:
### 確認版本號或路徑是否更新
print(str(os.path.exists(file1)))
print(str(os.path.exists(file2)))
if os.path.exists(file1) and os.path.exists(file2):
return True
else:
return False
def compare(file1, file2, lineSave, strS, strS2, look = True):#比較兩檔案內容差異並列出
lineNum = 1
#確認檔案存在
print ('兩檔案皆存在...' + str(fileExists(file1, file2)) +'\n')
if not fileExists(file1, file2):
print ('不存在該檔案,將自動新增...\n')
f2 = open(file2, 'x', encoding = 'utf-8')
f2.close()
f1 = open(file1, encoding = 'utf-8')
f2 = open(file2, encoding = 'utf-8')
#讀入各自變數
flist1 = [x for x in f1]
flist2 = [y for y in f2]
#得出資料長度
flines1 = len(flist1)
flines2 = len(flist2)
#對兩串列作等長處理以比較
if flines1 < flines2:
flist1[flines1:flines2+1] = ' ' * (flines2 - flines1)
elif flines1 > flines2:
flist2[flines2:flines1+1] = ' ' * (flines1 - flines2)
#輸出比較結果
if look:
print ('%s和%s比較結果:\n' % (file1, file2))
for y in zip(flist1, flist2):#字典化合併處理
if y[0] == y[1]:
lineNum +=1
continue
if y[0] != y[1] :#發現相異內容就呈現
if look:
print('第%s行: %s <--> %s\n' % (lineNum, y[0].strip(),
y[1].strip()))
lineNum +=1
lineSave.append(lineNum-1)#保留相異資訊的行號
strS.append(y[0])
strS2.append(y[1])
#未有內容呈現,回報兩檔案相同
if len(lineSave) == 0:
print ('%s 和 %s \n內容和排版完全相同!' % (file1, file2))
def contentModify(fileO, fileM, lineSave, strS, strS2):#進行內容修改(以fileO為準修正fileM)
#確認有內容要更新
if len(lineSave) == 0:
print ('沒有要更新的內容!')
return
#開啟兩檔案,一個讀取,一個寫入
file = open(fileO, 'r', encoding = 'utf-8')
file2 = open(fileM, 'w', encoding = 'utf-8')
lineN = 0
for line in file:#修改內容回報
if(lineN < len(lineSave)) and strS2[lineN] in line:
print ('修正第%s行內容...' % lineSave[lineN])
lineN += 1
#print(line)
file2.write(line)
#隨手關檔
file2.close()
file.close()
#回收空間
lineSave.clear()
strS.clear()
strS2.clear()
def addNote(file, note, jum = True):#追加註記
if not jum:
return
#開啟檔案
f = open(file, 'a', encoding = 'utf-8')
#寫入註記
note = '\n##' + note + '\n##' + time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime()) + '秒 註\n'
f.write(note)
print ('完成註記\n')
#隨手關檔
f.close()
def keyHandle(file, n):
key = ['test','吳俊廷-195','李重瑩-196','鄭宇軒-197','連士謙-198']
file = open(file, 'r+', encoding = 'utf-8')
fileCon = file.read()
fileCon = fileCon.replace('keyname = \'test\'', 'keyname = \'%s\'' % key[n])
file.seek(0,0)
file.write(fileCon)
file.close()
if n > 0:
print('\n' + str(194 + n) + '=======成功修正關鍵字!=======')
else:
print('\n' + 'test' + '=======成功修正關鍵字!=======')
def update(new, files, li, note, strS, strS2, p, ju, look):
compare(new, files, li, strS, strS2, look)
print ('=====================開始更新======================')
contentModify(new, files, li, strS, strS2)
##print ('==============更新結束,比對更新結果===============')
##compare(new, files, li, strS, strS2, look)
keyHandle(files, p)
addNote(files, note, ju)
print ('\n完成%s更新!\n' % files)
###
li = []#行號
strS = []#對照檔
strS2 = []#待修正檔
ju = True #跳過註解
'''
stdFile = 'K:/tuser/user.py'
files = ['C:/Users/Public/Downloads/user/user-t/user-3.py']
'''
stdFile = 'K:/tuser/user.py'
files = ['C:/Users/Public/Downloads/user/user-t/user-5.py','C:/Users/Public/Downloads/user/user-195/user-195.py', 'C:/Users/Public/Downloads/user/user-196/user-196.py', 'C:/Users/Public/Downloads/user/user-197/user-197.py', 'C:/Users/Public/Downloads/user/user-198/user-198.py']
ans = input('\n先進行校對檢視?')
if ans == 'y' or ans == '1':
for j in range(len(files)):
print('===================================================')
print ('===================核對第%s個檔案===================' % str(j+1))
print('===================================================')
compare(stdFile, files[j], li, strS, strS2)
elif ans == 'n' or ans == '0':
print ('取消校對')
pass
ans = input('\n進行批量更新?(y/n)')
if ans == 'y' or ans == '1':
note = input('\n更新內容註記:')
if note == '':
ju = False
#計時開始
start_t = time.time()
for i in range(len(files)):
print ('===================更新第%s個檔案===================' % str(i+1))
update(stdFile , files[i], li, note, strS, strS2, i, ju, False)
print ('完成批次更新!')
#計時結束
end_t = time.time()
#v顯示計時結果
print ('\n花費時間為 %s 秒' % str(end_t - start_t))
elif ans == 'n' or ans == '0':
print ('取消更新')
pass
print('按任一鍵結束...')
os.system('pause')
```
## 多行內容翻譯處理
```python=
from googletrans import Translator
import os, sys
##多行內容翻譯處理
'''
py3 中,input()只能输入一行
但 sys.stdin.readlines() 僅需
按下换行键後輸入 ctrl + z 才能
按 enter 鍵结束輸入
pip install googletrans
'''
def tranStr(tString, cut):#去掉換行與銜接
###'':'%',
afterStr = ''
for p in range(len(tString)):
afterStr += tString[p][0:len(tString[p])-1] + ' '
##print(afterStr)
if cut == 'c' or cut == '1':
aStrlist = [None]
aStrlist = recutStr(afterStr)
return aStrlist
else :
return afterStr
def recutStr(cString):#逐一分句
aStr = []
starStr = 0
endStr = 0
for p in range(len(cString)):
if cString[p] == '.' or cString[p] == ':':
endStr = p + 1
aStr.append(cString[starStr:endStr])
starStr = endStr + 1
##print(aStr)
return aStr
def gTranStr(tContext, cut):#接收輸入並翻譯
'''
別妄想要寫爬蟲來爬結果,因為每筆資料都有個tk 值尾隨,那個計算和取得的工程浩大
放棄吧!
'''
translator = Translator()
googleAns = tranStr(tContext, cut)
if cut == 'c' or cut == '1':
for i in range(len(googleAns)):
response = translator.translate(googleAns[i], dest='zh-TW').text
print('\n' + '-' * 30 + ' 第 ' + str(i+1) + ' 句 ' + '-' * 30 + '>>')
print(' ' + googleAns[i] + '\n')
print(response)
else :
response = translator.translate(googleAns, dest='zh-TW').text
print('\n ' + googleAns + '\n')
print(response)
###
cut = input('是否需要逐句翻譯?(輸入 c 或 1 為是,否則按 Enter 鍵,之後不會再追問)')
if len(cut) == 0:
cut = ''
while True:
beforeString = ''
print('輸入欲翻譯的內容,按下最後一次換行鍵後,輸入 ctrl + z 再按 enter 鍵才算結束輸入:')
'''
#多行讀入的寫法
for line in sys.stdin:
beforeString += line
但 cmd 時會有無限輸入的麻煩
'''
beforeString = sys.stdin.readlines()
##print(beforeString)
print('=' * 28 + ' 翻譯結果 ' + '=' * 28)
gTranStr(beforeString, cut)
print('\n' + '=' * 28 + ' 翻譯至此 ' + '=' * 28)
re = input('\n輸入 n 離開,'
+ '不輸入按 Enter 鍵重新開始,'
+ '輸入 # 反轉上次的逐句翻譯設定並重新開始\n')
## + '輸入 @ 清空版面並重新開始\n')
if re == 'n' or re == '0':
break
elif re == '#':
if cut == '':
cut = 'c'
elif cut == 'c':
cut = ''
pass
'''
elif re == '@':
os,system('cls')
就算改 clear 亦沒有作用,都會閃退,奇怪...
'''
os.system('pause')
```
## 爬取學校的活動系統
```python=
from requests import get
from bs4 import BeautifulSoup
import os
##爬取學校的活動系統
'''
soup.select('h3.r a')中的h3為標籤名稱.為class屬性,
所以.後面接class名稱也就是r,# 為 id屬性。
soup.prettify()
印出網頁原始碼
'''
actUrl = "https://webap.nptu.edu.tw/aes/aes/aee0010.aspx"
##
def adjust(infList, aP, bP, add = False):#調整串列內容
if add:
infList[aP] += ' ' + infList[bP]
else:
infList[aP] += infList[bP]
infList.remove(infList[bP])
def spicalSet(adList, num):
#自行定義調整後的串列,參數的串列不會被更改,會由另一個串列回傳
backList = adList
#進行次數
i = len(backList) - 1
while(i):
adjust(backList, 0, 1, True)
i -= 1
return backList
def check(p, tarStr, clist):#核對統計結果並輸出
#預設不寫入
w = False
afterList = []
for i in range(len(clist)):
if i % 7 == 0:#找到資料組(7個一組)的頭並核對欄位
if clist[i + p] == tarStr:
w = True
else:
w = False
##print(str(i) + ' ' + str(w) + ' ' + clist[i + p])
if not w:#不符則跳過不繼續寫入
continue
afterList.append(clist[i])
return afterList
def crawlbug(url, appoint = False):#預設將不能報名的淘汰,但會一併呈現'未開始'的
#取得網頁資料
r = get(url)
#將網頁資料以html.parser
soup = BeautifulSoup(r.text,"html.parser")
#找到各欄位資料
allData = soup.select('table#GridView1 td')
'''
各欄位資料如下:
每 7 個為一筆資料循環,記得加.text.split()保留純文字,不然會連html都跑出來
'''
'''
開啟布林參數(appoint)並設定數字參數(point),將對資料進行單一過濾
'''
allresult = []#首輪輸出結果,未調整
result = []#最終輸出結果
sta = []#儲存統計值
jump = True #決定跳過該輪資料寫入
point = 7 #指定欄位指標
allDis = False #是否全顯示
#指定欄位顯示
if appoint:
print('0 -活動名稱')
print('1 -報名對象')
print('2 -主辦單位')
print('3 -錄(備)取人數')
print('4 -活動起迄日期')
print('5 -報名起迄日期')
print('6 -報名狀態')
point = input('輸入指定報名狀態(數字):')
point = int(point)
if point < 0 or point > 7:
point = 7
default = input('\n是否完全顯示所有報名狀態(涵蓋\'已截止\'、\'已額滿\',預設自動排除)?(y/n)')
if default == 'y' or default == '1':
allDis = True
elif default == 'n' or default == '0':
allDis = False
else:
print('\n例外選項,自動回歸預設處理...\n')
#進行預設(排除'已截止'、'已額滿')整理
for i in range(len(allData)):
if i % 7 == 0:
if appoint == True and i < len(allData) and allDis == False:
if allData[i + 6].text.split() == ['已截止'] or allData[i + 6].text.split() == ['已額滿']:
jump = False
else:
jump = True
if not jump:#決定是否寫入
continue
data = allData[i].text.split()
##print ('%s %s' % (i, data))
adData = spicalSet(data, i % 7)
##print (str(i) + ' ' + adData[0])
allresult.append(adData[0])
#寫入過濾條件
if point != 7 and i % 7 == 6:
if i < 7:
if sta.count(allresult[point]) == 0:
sta.append(allresult[point])
else:
long = len(allresult)
if sta.count(allresult[long - 1 - (6 - point)]) == 0:
sta.append(allresult[long - 1 - (6 - point)])
if point != 7:#列出指定欄位下的選項
print('\n目標代號如下:')
for j in range(len(sta)):
if j < 10:
print(str(j) + ' ' + sta[j])
else:
print(str(j) + ' ' + sta[j])
print('-')
#選擇該選項
numP = int(input('\n輸入代號:'))
#進行核對輸出
result = check(point, sta[numP], allresult)
else:
result = allresult
#確認無資料顯示
if len(result) == 0:
return print ('\n沒有可顯示的資料!\n')
#為顯示資料組間作分隔
for i in range(len(result)):
if i % 7 == 0 :
print ('<===================第%s筆資料===================>\n' % str(int(i/7) + 1))
print (result[i])
print ('\n')
#資源回收
result.clear()
##
ans = input('是否有指定欄位與內容?(y/n)')
if ans == 'y' or ans == '1':
crawlbug(actUrl, True)
elif ans == 'n' or ans == '0':
crawlbug(actUrl)
else:
print('\n例外選項,自動回歸預設處理...\n')
os.system('pause')
```
## 動態進度點
```python=
import time
import sys, os
##動態進度點
#該效果限在 cmd 時才看的到喔!
for i in range(101):
time.sleep(0.005)
sys.stdout.write("\r%d%%" % i)
sys.stdout.flush()
print()
print('跑開心的,沒什麼用途~~')
os.system('pause')
```
## 連線程式client端
```python=
import socket, time, os, struct
##連線程式client端
'''
'''
HOST = "163.24.242.196"
PORT = 20
choose = ''
keyname = 'test1'
def DownLoad(choose):
sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sockfd.connect_ex((HOST,PORT))
print (HOST,"建立連線")
b = choose.encode()
sockfd.sendall(b)
fileinfo_size = struct.calcsize('128sl')
buf = sockfd.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip(b'\00')
new_filename = os.path.join(b'./'+ fn)
print ('檔案名稱為 {0}, 大小 {1}'.format(new_filename,filesize))
recvd_size = 0 # 定義已接收檔案的大小
fp = open(new_filename, 'wb')
print ('開始接收')
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = sockfd.recv(1024)
recvd_size += len(data)
else:
data = sockfd.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
print ('下載中...')
fp.close()
print ('下載完成')
print ("與",HOST,"結束連線")
sockfd.close()
def punch(name, choose):
sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sockfd.connect_ex((HOST,PORT))
print (HOST,"建立連線")
b = choose.encode()
sockfd.send(b)
time.sleep(0.5)
#送出名稱
print ('你好! ',name,' 歡迎來到網路實驗室!')
txtData = name
Cbyt = txtData.encode()
sockfd.send(Cbyt)
print ('送出打卡訊息')
#等待回覆
response = sockfd.recv(1024).decode()
print(response)
print ("與",HOST,"結束連線")
sockfd.close()
###主介面
#sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
#連線
#sockfd.connect_ex((HOST,PORT))
#print (HOST,"建立連線")
while True:
print ('----------------------------------------' +
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
#主畫面
print ("(1)download -下載記錄檔")
print ("(2)punch -打卡")
choose = input("請輸入想操作的內容: ")
#需要連線伺服器的功能才要這兩行
#byt = choose.encode()
#sockfd.sendall(byt)
if choose == '1':
DownLoad(choose)
elif choose == '2':
punch(keyname, choose)
#暫停以檢視
print ('按任一鍵結束...')
os.system('pause')
except socket.error as msg :
print (msg)
print ("連線中斷or失敗,倘若仍有操作尚未完成,洽相關人員~~:)")
#暫停以檢視
print ('按任一鍵結束...')
os.system('pause')
```
## 郵件檢視 + 隱藏密碼輸入
```python=
import imaplib, email, base64, quopri, binascii, getpass
from os import system
##郵件檢視 + 隱藏密碼輸入
'''
payload = "測爽沒"
b =base64.b64encode(payload.encode('utf-8')).decode("utf-8")
print(b)
c = base64.b64decode(b.encode("utf-8")).decode("utf-8")
print(c)
b =quopri.encodestring(payload.encode("utf-8")).decode("utf-8")
print(b)
c = quopri.decodestring(b.encode("utf-8")).decode("utf-8")
print(c)
GetPassWarning: Can not control echo on the terminal.
Warning: Password input may be echoed
因為 getpass 效果僅限於 cmd 介面喔!
'''
def selfbase64(string):#實作base64
'''
只能轉英文不能轉中文,會亂碼
找不到轉中文的對應辦法,有夠爛
網路上各種互抄,還只抄轉出去的,沒抄轉回來的
'''
base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
stringFirst = ''
for i in range(len(string)):
point = base64Table.find(string[i])
pointStr = str(point)
if len(pointStr) < 2:
pointStr = '0' + pointStr
stringFirst += pointStr
#print (point)
strSecond = ''
for j in range(len(stringFirst)):
if j % 2 == 1:
continue
num = int(stringFirst[j:j+2])
#print(str(num))
numStr = ''
for k in range(6):
numStr = str(num % 2) + numStr
num = num // 2
#print(str(num) + ' ' + numStr)
strSecond += numStr
#print (stringFirst[j:j+2] + ' ' + numStr)
#print(strSecond)
strThird = ''
#print(str(len(strSecond)))
key = 8
uninum = ''
for m in range(len(strSecond)):
if m % key != 0:
continue
ascStr = strSecond[m:m+key]
#print(str(m//16) + ' ' + str(len(ascStr)) + ' ' + ascStr)
num = 0
for n in range(key):
powN = 2**(key-n-1)
num += int(ascStr[n])* powN
uninum += chr(num)
#print(str(num) + ' ' + uninum + '\n')
print(uninum)
def printMail(ue, pd):#挖郵件
many = input('輸入顯示的數量(全顯示輸入a,預設為前五筆):')
#預設顯示郵件數量
lim = 5
try:
m = imaplib.IMAP4_SSL('imap.gmail.com', 993)
m.login(ue, pd)
status, count = m.select()
email_count = len(m.search(None, 'ALL')[1][0].split())
except:
if many == 'a':
lim = email_count
elif many == '':
pass
elif int(many) > email_count:
print('數量過大,自動轉成最大值')
else:
lim = int(many)
print('郵件總數為: ' + str(email_count) + ' ' + '指定數量為: ' + str(lim))
print()
for i in range(email_count):
status, email_content = m.fetch(f'{email_count-i}'.encode(), '(RFC822)')
try:
email_content = email_content[0][1].decode()
#print (email_content)
except:
#print (email_content)
print(str(i+1) + ' 該郵件發生錯誤,跳過顯示...\n')
continue
strat = email_content.find('MIME-Version: 1.0')
dateStart = email_content.find('Date:', strat)
if dateStart == -1:
dateStart = email_content.rfind('Date:')
dateEnd = email_content.find('\r',dateStart)
date = email_content[dateStart:dateEnd]
subStart = email_content.rfind('Subject:')
subEnd = email_content.find('\r',subStart)
sub = email_content[subStart:subEnd]
froStart = email_content.find('From:', strat)
if froStart == -1:
froStart = email_content.rfind('From:')
froEnd = email_content.find('\r',froStart)
fro = email_content[froStart:froEnd]
sub = sub.lstrip('Subject:Re ')
if sub[0] == '=':
backup = sub
sub = sub.strip().strip('=?').lstrip('UTFutf-8?')
if sub[0] == 'b' or sub[0] == 'B':
sub = sub.lstrip('Bb?')
try:
long = len(sub) % 4
if long != 0:
for many in range(4 - long):
sub += '='
sub = base64.b64decode(sub.encode('utf-8')).decode('utf-8')
except :
print (str(i+1) + ' ' + backup + ' ' + str(len(backup)))
print (' ' + sub + ' ' + str(len(sub)) + '\n')
continue
elif sub[0] == 'q' or sub[0] == 'Q':
sub = sub.lstrip('Qq?_')
try:
sub = quopri.decodestring(sub.encode('utf-8')).decode('utf-8')
except :
print (str(len(sub)) + ' ' + sub)
continue
fro = fro.lstrip('From: ')
if fro[0] == '=':
backup = fro
fro = fro.strip().strip('=?').lstrip('UTFutf-8?')
if fro[0] == 'b' or fro[0] == 'B':
fro = fro.lstrip('Bb?')
try:
long = len(fro) % 4
if long != 0:
for many in range(4 - long):
fro += '='
fro = base64.b64decode(fro.encode('utf-8')).decode('utf-8')
except :
fro = backup
continue
elif fro[0] == 'q' or fro[0] == 'Q':
fro = fro.lstrip('Qq?_')
#try:
fro = quopri.decodestring(fro.encode('utf-8')).decode('utf-8')
#except :
#fro = backup
#continue
print (str(i+1) + ' ' + sub)
print ('From: ' + fro)
print (date)
print ('')
if i == lim - 1:
break
m.close()
m.logout()
username = input('郵件帳號:')
password = getpass.getpass('密碼:')
printMail(username, password)
system('pause')
```
## 檔案比較與更新
```python=
import os, time, threading
##批量檔案內容更新
def fileExists(file1, file2):#確認兩檔案是否皆存在
if os.path.exists(file1) and os.path.exists(file2):
return True
else:
return False
def compare(file1, file2, lineSave, strS, strS2, look = False):#比較兩檔案內容差異並列出
lineNum = 1
if fileExists(file1, file2):#確認檔案存在
print ('該檔案存在...')
else:
print ('不存在該檔案,將自動新增...')
f2 = open(file2, 'x', encoding = 'utf-8')
f2.close()
f1 = open(file1, encoding = 'utf-8')
f2 = open(file2, encoding = 'utf-8')
#讀入各自變數
flist1 = [x for x in f1]
flist2 = [y for y in f2]
#得出資料長度
flines1 = len(flist1)
flines2 = len(flist2)
#對兩串列作等長處理以比較
if flines1 < flines2:
flist1[flines1:flines2+1] = ' ' * (flines2 - flines1)
elif flines1 > flines2:
flist2[flines2:flines1+1] = ' ' * (flines1 - flines2)
#輸出比較結果
if look:
print ('%s和%s比較結果:\n' % (file1, file2))
for y in zip(flist1, flist2):#字典化合併處理
if y[0] == y[1]:
lineNum +=1
continue
if y[0] != y[1] :#發現相異內容就呈現
if look:
print('第%s行: %s <--> %s\n' % (lineNum, y[0].strip(),
y[1].strip()))
lineNum +=1
lineSave.append(lineNum-1)#保留相異資訊的行號
strS.append(y[0])
strS2.append(y[1])
#未有內容呈現,回報兩檔案相同
if len(lineSave) == 0:
print ('\n%s和%s內容和排版完全相同!' % (file1, file2))
def contentModify(fileO, fileM, lineSave, strS, strS2):#進行內容修改(以fileO為準修正fileM)
#確認有內容要更新
if len(lineSave) == 0:
print ('\n沒有要更新的內容!')
return
#開啟兩檔案,一個讀取,一個寫入
file = open(fileO, 'r', encoding = 'utf-8')
file2 = open(fileM, 'w', encoding = 'utf-8')
lineN = 0
for line in file:#修改內容回報
if(lineN < len(lineSave)) and strS2[lineN] in line:
sys.stdout.write('修正第%s行內容...' % lineSave[lineN])
sys.stdout.flush()
#print ('修正第%s行內容...' % lineSave[lineN])
lineN += 1
##print(line)
file2.write(line)
#隨手關檔
file2.close()
file.close()
#回收空間
lineSave.clear()
strS.clear()
strS2.clear()
def addNote(file, note):#追加註記
#開啟檔案
f = open(file, 'a', encoding = 'utf-8')
#寫入註記
note = '\n##' + note + '\n##' + time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime()) + '秒 註\n'
f.write(note)
print ('完成註記\n')
#隨手關檔
f.close()
def update(new, files, li, note, strS, strS2, look):
compare(new, files, li, strS, strS2, look)
print ('=====================開始更新======================')
contentModify(new, files, li, strS, strS2)
#print ('==============更新結束,比對更新結果===============')
#compare(new, files, li, strS, strS2, look)
#addNote(files, note)
print ('完成該檔更新!\n')
##
li = []#行號
strS = []#對照檔
strS2 = []#待修正檔
stdFile = 'K:/tserver/server-2.py'
files = ['C:/Users/BigBapu/Desktop/server/server-2.py']
for j in files:
print ('===================更新第%s個檔案===================' % str(files.index(j)))
compare(stdFile, j, li, strS, strS2, True)
ans = input('進行批量更新?(y/n)')
if ans == 'y' or ans == '1':
note = input('\n更新內容註記:')
start_t = time.time()
for i in range(len(files)):
print ('===================更新第%s個檔案===================' % str(i+1))
thread_Update = threading.Thread(target = update,
args = (stdFile , files[i],
li, note, strS, strS2, False))
thread_Update.start()
thread_Update.join()
#update(stdFile , files[i], li, note, strS, strS2, False)
print ('完成批次更新!')
end_t = time.time()
print ('\n花費時間為 %s 秒' % str(end_t - start_t))
elif ans == 'n' or ans == '0':
print ('取消更新')
pass
#暫停以檢視
print('按任一鍵結束...')
os.system('pause')
```
## 檔案備份
```python=
import shutil, os
##檔案備份
p = 'C:/Users/Public/Downloads/user/user-t/user-5.py'
##
def backup(oriPath, newdir):#移動舊版本至備份區(backup/)
print('備份目錄是否存在...' + str(os.path.isdir(newdir)))
if not os.path.isdir(newdir):#如果指定目錄不存在就建立目錄
os.mkdir(newdir)
print ('建立新目錄' + newdir)
if os.path.isfile(oriPath):#確認待更新檔案存在
#複製至指定路徑下
shutil.copyfile(oriPath, newdir + oriPath.split('/')[-1])
#擷取路徑各個位置
'''
print(p)
print(p.split('/')[-1])
print('')
print(p.split('/')[-1].split('.')[0].split('-')[0])
print(p.split('/')[-1].split('.')[0])
print(str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1))
print(p.split('/')[-1].split('.')[1])
print('')
print(p[0:len(p)-len(p.split('/')[-1])] + p.split('/')[-1].split('.')[0].split('-')[0] + '-' +
str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1) +
'.' + p.split('/')[-1].split('.')[1])
print(str(len(p)-len(p.split('/')[-1])))
print(os.path.isfile(p))
'''
#修改檔名
os.rename(oriPath,
p[0:len(p)-len(p.split('/')[-1])] + p.split('/')[-1].split('.')[0].split('-')[0] + '-' +
str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1) +
'.' + p.split('/')[-1].split('.')[1])
print ('備份檔案完成!')
else:
print ('待更新的檔案不存在!')
'''
print(p)
print(p.split('/')[-1])
print('')
print(p.split('/')[-1].split('.')[0].split('-')[0])
print(p.split('/')[-1].split('.')[0])
print(str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1))
print(p.split('/')[-1].split('.')[1])
print('')
print(p[0:len(p)-len(p.split('/')[-1])] + p.split('/')[-1].split('.')[0].split('-')[0] + '-' +
str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1) +
'.' + p.split('/')[-1].split('.')[1])
print(str(len(p)-len(p.split('/')[-1])))
print(os.path.isfile(p))
'''
backup (p, 'C:/Users/Public/Downloads/user/backup/')
print('\n當前更新後版本號為%s' % str(int(p.split('/')[-1].split('.')[0].split('-')[1]) + 1) )
os.system('pause')
##
```
## 視覺化歷年黃金價格
```python=
import pandas as pd # 資料處理套件
import matplotlib.pyplot as plt # 資料視覺化套件
import numpy as np
'''
記得將新下載的csv做欄位名稱的預處理(中文換英文,多餘欄位刪除)
'''
csvs = '107GoldPassbook.csv'
def disPic(csv, sea):
readCsv = pd.read_csv(csv)
# print( readCsv['buyin'][:]) # 顯示資料
date = [None] * len(readCsv['date']) # 建立一個空列表,數量為年月的數量
# 以for迴圈逐一將年月資料類別轉成字串類別
for i in range(len(readCsv['date'])):
date[i] = str(readCsv['date'][i])[4:8]
readCsv['date'] = date[::-1] # 將原本年月欄位資料反轉並替換掉,因為預設為資料為年尾到年初
# 設定視窗大小、邊界顏色、邊框顯示
plt.figure(figsize=(10.5,3.5), edgecolor = 'b', frameon = True)
# 設定圖表與視窗的邊界距離(比例)
plt.subplots_adjust(left = 0.07, right = 0.99, top = 0.9, bottom = 0.18)
plt.style.use('ggplot') # 使用ggplot主題樣式
# 畫第一條線,plt.plot(x, y, c)參數分別為 x 軸資料、 y 軸資料及線顏色 = 紅色
plt.plot(readCsv['date'], readCsv['buyin'],c = 'r')
# 畫第二條線
plt.plot(readCsv['date'], readCsv['sellout'],c = 'g')
# 設定圖例,參數為標籤、位置
plt.legend(labels=['buyin', 'sellout'], loc = 'best')
star = readCsv['date'][0]
end = len(readCsv['date'])
if int(sea) >= 1 and int(sea) <= 4:
if sea == '1':
end = end / 4
elif sea == '2':
star = end / 4
end = end / 2
elif sea == '3':
star = end / 2
end = end * 3/4
elif sea == '4':
star = end * 3/4
elif sea == '':
pass
else:
print('界外輸入,將回復預設值(全年)')
pass
# 設定x軸顯示範圍
plt.xlim(star, end) # 設定 x 軸顯示範圍
plt.xlabel('Date', fontweight = 'bold',fontsize = 12) # 設定 x 軸標題及粗體
plt.xticks(fontsize = 8, rotation = 35) # 將 x 軸數字旋轉35度,避免文字重疊
# 設定y軸標題及粗體
plt.ylabel('Price(NTW)', fontweight = 'bold')
plt.yticks(fontsize = 8, rotation = 20)# 刻度字體大小、逆時鐘旋轉角度
# 設定標題、文字大小、粗體及位置
plt.title('Gold Price', fontsize = 15, fontweight = 'bold', y = 1)
'''
plt.savefig('Goldgrowth.jpg', # 儲存圖檔
bbox_inches='tight', # 去除座標軸占用的空間
pad_inches=0.0) # 去除所有白邊
'''
plt.show()
plt.close() #隨手關燈~
season = input('輸入指定季節(預設輸入空值為整年度):')
disPic(csvs, season)
```