延續上一篇,
這次是要將股票的買賣資料直接上傳到自己交易記錄的google試算表,
省的一個一個key。
PDF的解密並產出無密碼的pdf程式網路上已經找的到,
請參考Python--PyPDF3解密解析PDF文件(解密加密的PDF代码)
其他完整的程式碼請參考以下。
之後email收到券商的對帳單就將他放到下載項目,
開啟這個程式就全部上傳了,
橘色的部份再自行修改。
import os
import tabula
import re
import csv
from tabula import read_pdf
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter
import gspread
from google.oauth2.service_account import Credentials
#google sheet授權
scopes = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']
credentials = Credentials.from_service_account_file('google金鑰',scopes=scopes)
gc = gspread.authorize(credentials)
spreadsheet_key='google ID'
sheet=gc.open_by_key(spreadsheet_key).worksheet("交易") #寫入名稱為交易的sheet
#生成無密碼pdf
def get_reader(filename, password):
try:
old_file = open(filename, 'rb')
print('檔案開啟成功')
except Exception as err:
print('檔案開啟失敗!' + str(err))
return None
# 建立讀例項
pdf_reader = PdfFileReader(old_file, strict=False)
# 解密操作
if pdf_reader.isEncrypted:
if password is None:
print('%s檔案被加密,需要密碼!' % filename)
return None
else:
if pdf_reader.decrypt(password) != 1:
print('%s密碼不正確!' % filename)
return None
if old_file in locals():
old_file.close()
return pdf_reader
def decrypt_pdf(filename, password, decrypted_filename=None):
"""
將加密的檔案及逆行解密,並生成一個無需密碼pdf檔案
:param filename: 原先加密的pdf檔案
:param password: 對應的密碼
:param decrypted_filename: 解密之後的檔名
:return:
"""
# 生成一個Reader和Writer
pdf_reader = get_reader(filename, password)
if pdf_reader is None:
return
if not pdf_reader.isEncrypted:
print('檔案沒有被加密,無需操作!')
return
pdf_writer = PdfFileWriter()
pdf_writer.appendPagesFromReader(pdf_reader)
if decrypted_filename is None:
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + 'decrypted' + '.pdf'
# 寫入新檔案
pdf_writer.write(open(decrypted_filename, 'wb'))
#PDF轉成transaction.csv存放在MAC下載資料夾
tabula.convert_into(decrypted_filename, '/Users/PercyChang/Downloads/transaction.csv', output_format ='csv', pages='all')
#移除csv字串裡的 ","
def tranint(tran):
tran=tran.replace(',','')
return tran
#讀取pdf檔案名稱符合 [\W]M12xxxxx[0-9A-Z]+
for path in os.listdir(r'/Users/PercyChang/Downloads/'):
pdfpath=re.findall('[\W]M12xxxxx[0-9A-Z]+',path)
if pdfpath != []:
break
#生成無密碼pdf
decrypt_pdf(r'/Users/PercyChang/Downloads/'+pdfpath[0]+'.pdf', 'pdf密碼')
#打開transaction.csv並讀取每一個row
t=open('/Users/PercyChang/Downloads/transaction.csv','r')
交易內容=csv.reader(t)
#CSV內容整理並存放到upload[]
upload=[]
for row in 交易內容:
#pdf名稱取代自行記錄的名稱
row[0]=row[0].replace('富邦公司治','00692富邦公司治理')
row[0]=row[0].replace('富邦美債2','00696B富邦美債20年')
try:
if row[1]=='集買':
row[1]=int(tranint(row[2]))
else:
row[1]=int(tranint(row[2]))*-1
except:
#買賣股數改為數字
row[1]=tranint(row[1].replace('集買',''))
row[1]=tranint(row[1].replace('集賣 ','-'))
row[1]=int(tranint(row[1]))
#刪除空白欄
del row[2]
#股價改成數字
row[2]=float(row[2])
#買入金額改成數字
row[3]=int(tranint(row[3]))
#手續費+交易稅
if row[5]!='':
row[4]=int(row[4])+int(row[5])
else:
row[4]=int(row[4])
#總投入金額改成數字
if row[6]!='':
row[6]=int(tranint(row[6]))
else:
row[6]=int(tranint(row[7]))*-1
del row[5]
del row[6]
#分拆時間與標的物
if row[0].startswith('109') is True:
upload=row[0].split()
upload.extend(row[1:])
else:
del upload[1:]
upload.extend(row[0:])
print(upload)
#upload上傳google sheet
sheet.append_row(upload)
#刪除所有檔案
try:
os.remove(r'/Users/PercyChang/Downloads/'+pdfpath[0]+'.pdf')
os.remove(r'/Users/PercyChang/Downloads/'+pdfpath[0]+ '_' + 'decrypted' + '.pdf')
os.remove(r'/Users/PercyChang/Downloads/transaction.csv')
except OSError as e:
print(e)
else:
print("檔案上傳並刪除成功")
參考書籍:Python程式設計入門:金融商管實務案例(第三版) (電子書)
這本書主要我拿來查詢pthon資料的語法,對python一些字串、陣列的提取、計算、整理,檔案處理,物件導向設計等等都寫的蠻清晰的,是本python語法的入門書。