1. 程式人生 > >【Python程式設計】MemoAdmin (Mark)

【Python程式設計】MemoAdmin (Mark)

MemoAdmin (Mark)


excel


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import openpyxl
import datetime
import time
from core import loglog

log = loglog.yankerp()
year_list = [2013, 2014, 2015, 2016, 2017, 2018]


def excel(file_result, text_name, file_save):
    """
    程式功能-分析btc.xlsx 檔案,並儲存
    """
wb = openpyxl.load_workbook(file_result) sh = wb.active index = 0 for i in range(len(year_list)): count = 2 sh1 = wb.create_sheet(str(year_list[index])) for rows in sh.rows: if rows[0].coordinate != "A1" and datetime.datetime.strptime(rows[0].value,
'%Y-%m-%d %H:%M:%S %Z').year == year_list[index]: # print(rows[0].value, rows[1].value) sh1["A1"] = "日期" sh1["B1"] = "金額" sh1["A" + str(count)] = rows[0].value sh1["B" + str(count)] = rows[1].value # print("in sh:", sh1["A" + str(count)].value, sh1["B" + str(count)].value)
print(f"正在分析{year_list[index]}年資料.....") count += 1 index += 1 wb.save(file_save + ".xlsx") def main(): "excel程式入口,接收檔案路徑-檔名稱" Your_excel_text = input("請您輸入需要分析excel檔案的路徑:").strip() file_name = input("請您輸入excel檔名稱:").strip() text_name = input("請您輸入分析完成後的檔名稱:").strip() file_result = os.path.join(Your_excel_text, file_name) file_save = os.path.join(Your_excel_text, text_name) start = time.time() excel(file_result, text_name, file_save) print(f"分析完成,用時{time.time() - start}秒,檔案路徑為:{file_save}")

loglog


#!/usr/bin/env python

import logging
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


def yankerp(logger_name="memo.log", log_file=os.path.join(BASE_DIR, "log", "memo.log"), level=logging.DEBUG):
    # 建立logger物件
    logger = logging.getLogger(logger_name)
    logger.setLevel(level) # 新增等級

    # 建立控制檯

    ch = logging.StreamHandler()
    ch.setLevel(level)

    # 建立檔案
    fh =  logging.FileHandler(filename=log_file, encoding="utf-8")

    # create formatter
    formatter = logging.Formatter("%(asctime)s %(filename)s [line:%(lineno)d] %(name)s %(levelname)s %(message)s")

    ch.setFormatter(formatter)
    fh.setFormatter(formatter)

    logger.addHandler(ch)
    logger.addHandler(fh)

    return logger

memo


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import time
import pickle
import sys
import configparser
import PyPDF2
from core import loglog


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
users_config_ini = os.path.join(BASE_DIR, "db", "users.ini")

log = loglog.yankerp()
__Author__ = "Memorandum"
print(f"Welcome to the {__Author__} System...".center(50, "-"))
memo_data = []


def memo(Your_title, Your_content, Your_Timespent):
    '備忘錄主功能函式,儲存事件,內容,用時時間等資料'
    data_memo = {}
    if Your_title.strip() == "" or Your_content.strip() == "":
        print("標題及內容不能為空!!!")
    else:
        data_memo["事件"] = Your_title
        data_memo["內容"] = Your_content
        data_memo["用時時間"] = Your_Timespent
        log.info("您已經生成一條備忘錄資訊...")
        text_file = os.path.join(BASE_DIR, "db", time.strftime("%Y-%m-%d_", time.localtime()) + "memo.txt")
        memo_data.append(data_memo) 
        for i in memo_data:
            for k, v in i.items():
                print(f"{k}:{v}")
            f = open(text_file, "a+")
            date = time.strftime("%Y-%m-%d %X", time.localtime())
            f.write(f"事件:{Your_title} | 內容:{Your_content} | 用時時間:{Your_Timespent} | 記錄時間:{date}" +  "\n")
            f.close()
            log.info(f"您已經記錄了{len(memo_data)}條備忘錄資訊,您是否還需要繼續寫入備忘錄(yes/no)?")
        Count = True
        while(Count):
            You = input("請您選擇:").strip()
            if You == "yes":
                Count = False
            elif You == "no":
                log.info("您已經退出了備忘錄程式...")
                sys.exit()
            else:
                log.error("您輸入的內容有誤,請您重新輸入!!!")
                Count = True


def main():
    '程式主入口,接收使用者輸入的事件,內容,時間,呼叫功能函式'
    Count = True
    while(Count):
        Your_title = input("請您輸入您的事件:").strip()
        Your_content = input("請您輸入您的內容:").strip()
        Your_Timespent = input("請您輸入您的用時時間:").strip()

        memo(Your_title, Your_content, Your_Timespent)

user_login_memo


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import pickle
import os
import sys
import configparser
import PyPDF2
from core import memo
from core import loglog
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO

__Author__ = "YanZanG"

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log = loglog.yankerp()
users_data = os.path.join(BASE_DIR, "db", "memo_data.txt")
users_config_ini = os.path.join(BASE_DIR, "db", "users.ini")

data = {
    "DEFAULT" : {
        "basedir": BASE_DIR,
        "name" : "memo",
        "users_data" : users_data,
        "users_config_ini" : users_config_ini
    },
}

print(f"Welcome to the {__Author__} memorandum".center(50, "-"))
print("Note: Registration is required for first use".center(50, "-"))


class Users():
    """
    此類包含使用者註冊、使用者資料儲存、配置檔案寫入
    """
    def __init__(self, Your_user_name, Your_user_password, data):
        self.Your_user_name = Your_user_name
        self.Your_user_password = Your_user_password
        self.db_file_path = os.path.join(BASE_DIR, "db", "users.pkl")
        self.User_data_list = []
        self.User_data = {}
        self.data = data

    def user_zc(self):
        """
        使用者註冊各個功能
        """
        if self.Your_user_name == "" or self.Your_user_password == "":
            print("使用者名稱或密碼不能為空,請您重新輸入!!!")
            Count = True
        else:
            self.User_data["使用者名稱"] = self.Your_user_name
            self.User_data["密碼"] = self.Your_user_password
            self.User_data_list.append(self.User_data)
            self.user_save()
            self.write_config()

    def user_save(self):
        """
        儲存使用者資料功能
        """
        with open(self.db_file_path, "wb") as f:
            pickle.dump(self.User_data_list, f)
        log.info("使用者名稱密碼儲存成功,以下是您的使用者名稱及密碼".center(50, "-"))
        for k, v in self.User_data.items(): 
            print(f"{k} : {v}")
    
    def write_config(self):
        """
        將使用者資料,使用者名稱密碼寫入到配置檔案.
        """
        config = configparser.ConfigParser()
        for k, v in self.data.items():
            config[k] = v
            config.add_section(self.Your_user_name)
            config.set(self.Your_user_name, "user_name", self.Your_user_name)
            config[self.Your_user_name]["password"] = self.Your_user_password
            with open(users_config_ini, "w") as f:
                config.write(f)
        
        log.info("主配置檔案載入成功!!!")


def user_registered(data):
    """
    使用者註冊函式入口
    """
    Count = True
    while(Count):
        Your_user_name = input("請您設定您的使用者名稱:").strip()
        Your_user_password = input("請您設定您的密碼:").strip()

        if Your_user_name == "" or Your_user_password == "":
            print("使用者名稱或密碼不能為空,請您重新輸入!!!")
            Count = True
        else:
            A = Users(Your_user_name, Your_user_password, data)
            A.user_zc()
            Count = False


class User_login():
    """
    使用者登陸類,此類提供使用者登陸並呼叫備忘錄功能函式
    """
    def __init__(self, user_login_name, user_login_password, data):
        self.user_login_name = user_login_name
        self.user_login_password = user_login_password
        self.db_file_path = os.path.join(BASE_DIR, "db", "users.pkl")
        self.data = data

    def name_load(self):
        """
        判斷使用者輸入的使用者名稱密碼是否正確,若不正確呼叫註冊類,若正確呼叫備忘錄函式
        """
        if os.path.exists(self.db_file_path):
            with open(self.db_file_path, "rb") as f:
                data = pickle.load(f)
                for key in data:
                    for k, v in key.items():
                        if v == self.user_login_name or v == self.user_login_password:
                            log.info("使用者名稱密碼正確,備忘錄登入成功!!!")
                            memo.main()
                        else:
                            print("這個使用者不存在,您是否需要註冊?(yes/no)?")
                            you = input("請您輸入您的選擇:").strip()
                            if you == "yes":
                                user_registered(self.data)
                                Count =  False
                            elif you == "no":
                                sys.exit("您選擇了退出.")
                            else:
                                print("系統檢測您輸入的內容失敗,請您重新輸入選擇!!!")
                                Count = True
        else:
            Count = True
            while(Count):
                print("第一次登陸需要註冊使用者資訊.您是否需要註冊(yes/no)?")
                you = input("請您輸入您的選擇:").strip()
                if you == "yes":
                    user_registered(self.data)
                    Count =  False
                elif you == "no":
                    sys.exit("您選擇了退出.")
                else:
                    print("系統檢測您輸入的內容失敗,請您重新輸入選擇!!!")
                    Count = True


def user_name_login():
    """
    使用者登陸主函式入口
    """
    Count = True
    while(Count):
        Your_user_name = input("請您輸入您的使用者名稱:").strip()
        Your_user_password = input("請您輸入您的密碼:").strip()

        A = User_login(Your_user_name, Your_user_password, data)
        A.name_load()


def menu():
    """
    使用此程式的主入口函式,提供使用者選單選擇,呼叫不同的函式.
    """
    Count = True
    while(Count):
        Menu = {
            "1" : "註冊賬戶",
            "2" : "登陸備忘錄",
            "q" : "退出程式"
        }
        
        for k, v in Menu.items():
            print(f"{k}、{v}")
        
        Your_choice = input("請您輸入:").strip().upper()
        if Your_choice == "":
            log.error("對不起,您輸入的選擇不能為空,請您重新輸入".center(50, "-"))
            Count = True
        elif Your_choice == "1":
            user_registered(data)
        elif Your_choice == "2":
            user_name_login()
        elif Your_choice == "Q":
            sys.exit()
        else:
            log.error("對不起,系統未能識別您輸入的內容,請您重新輸入...")
            Count = False

word


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from docx import Document
import os
import sys


class Document_word:
    """
    此類提供word文件的標題,副標題、正文、儲存功能
    """
    def __init__(self, doc_text_path, doc_name, doc_title, doc_subtitle, doc_text, index):
        self.Doc = Document()
        self.doc_text_path = doc_text_path
        self.doc_name = doc_name
        self.doc_title = doc_title
        self.doc_subtitle = doc_subtitle
        self.doc_text = doc_text
        self.index = index

    def add_title(self):
        """
        Word文件標題功能
        """
        self.index += 1
        self.Doc.add_heading(self.doc_title, level=self.index)

    def add_subtitle(self):
        """
        word文件副標題功能
        """
        self.Doc.add_paragraph(self.doc_subtitle, "Subtitle")

    def add_text(self):
        """
        新增正文功能
        """
        self.Doc.add_paragraph(self.doc_text)

    def save_doc(self):
        """
        儲存word文件功能
        """
        doc_path = os.path.join(self.doc_text_path, self.doc_name)
        self.Doc.save(doc_path)
        print(f"恭喜您寫入成功,存放路徑為{self.doc_text_path}文件名稱為:{self.doc_name}")
        sys.exit()


def content(file_path, file_name):
    """
    此函式接受使用者輸入的標題,內容,並呼叫Word類
    """
    Count = True
    index = 0 
    while(Count):
        index += 1
        content_title = input("請您輸入內容標題:").strip()
        content_subtitle = input("請您輸入內容副級標題:").strip()
        content_text = input("請您輸入正文文章內容:").strip()
        
        DOC = Document_word(file_path, file_name, content_title, content_subtitle, content_text, index)
        DOC.add_title()
        DOC.add_subtitle()
        DOC.add_text()

        print("恭喜您,寫入成功,是否修改寫入內容(yes/no)?") 
        your = input(">>>")
        if your == "yes":
            Count = True
        else:
            DOC.save_doc()
            Count = False


def file_path():
    """
    此函式提供接受使用者輸入路徑,文件名稱,判斷路徑是否正確.
    """
    Count = True
    while(Count):
        file_path = input("請您輸入需要儲存的路徑:").strip()
        file_name = input("請您輸入需要儲存的文件