【Python程式設計】MemoAdmin (Mark)
阿新 • • 發佈:2018-12-17
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("請您輸入需要儲存的文件