search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

[phthon]大昌券商股票買賣對帳單.pdf解密,轉為csv並上傳到google試算表

延續上一篇,

[Python]上傳List資料到google試算表

這次是要將股票的買賣資料直接上傳到自己交易記錄的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語法的入門書。




熱門推薦

本文由 percy10442pixnetnetblog 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦