Commit 3cff92d0 by ligang

'08homework~09homework'

parent 3b66662d
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
"""
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:给定二叉树 [3,9,20,null,null,15,7],
"""
class Solution:
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root: # 递归边界
return 0
else:
l = 1 + self.maxDepth(root.left) # 递归
r = 1 + self.maxDepth(root.right)
return max(l,r)
\ No newline at end of file
#!/usr/bin/env python3
#-*- coding:utf-8-*-
"""
4、工资计算
某公司内有多名员工,技术部门为减少财务部门每月计算工资的工作量,决定帮助他们写一个程序,以自动化的方式每月计算员工的工资。
具体需求如下:
(1)、员工类,员工拥有基本属性
员工编号 整数
姓名 字符串
基本信息 字符串
岗位与工资 list[dict] # list中的基本类型是字典,考虑到有员工可能身兼数职,此时计算工资的计算是累加的
# 比如员工A,程序员与扫地两项工作,每项工作的工资不同,结算工资时,需要两项加在一起
# 注意,这里的工资是按照周为单位来进行计算的,也就是说基本的数据结构应该是 [{"程序员",2000},{"扫地",1000}]
工资计算开始时间 字符串
工资计算结束时间 字符串
(2)、财务类
具体要求:
(1)、其中包含计算员工工资的方法,输入是员工类的实例。
(2)、要以员工的工作时长来计算工资,可以简单点用总工作时长除以7,就是固定周数,不足一周不算工资
(3)、以下表格为输出样式要求,将讲计算结果信息写入同一个excel表格中,excel名称为"员工工资计算"
输出表格基本样式
|员工编号| 工资结算时间| 员工姓名 | 员工基本信息 | 岗位 | 工资 | 说明 | 工资总计
| 1 | 2019-1 | 小A | 居住在回龙观 | 程序员 | 8000 | 工资结算4周 |
| 1 | 2019-1 | 小A | 居住在回龙观 | 扫地 | 4000 | 工资结算4周 | 12000
| 2 | 2019-1 | 小B | 居住在天通苑 | 程序员 | 8000 | 工资结算4周 | 8000
| 3 | 2019-1 | 小C | 居住在西二旗 | 程序员 | 8000 | 工资结算4周 | 8000
| 4 | 2019-1 | 小D | 居住在望京南 | 程序员 | 8000 | 工资结算4周 | 8000
(3)、跑通以上表格中的数据才算作业通过,自己要进行测试。
注意,后边一个员工调用工资方法时,不能覆盖上一个员工的信息,要追加写入,如果是同一个员工,写入第二条信息时的工资总计字段时要把第一条的清除掉
(4)、每进行一个员工的信息计算时,要求计算过程输入到日志cala_salary.log中,如果有错误发生,则打印到日志中错误信息。日志可自由配置合法选项即可(读取配置文件)
(5)、测试用例demo:
worker=worker()
worker.work_id=1
worker.name="小A"
worker.info="住在回龙观"
worker.work_and_salary_list = [{"程序员",2000},{"扫地",1000}]
worker.start_time="2019-01-01"
worker.end_time="2019-01-31"
Finace.calc_salary(worker)
worker=worker()
worker.name="小B"
worker.info="住在回龙观"
worker.work_and_salary_list = [{"程序员",2000},{"扫地",1000}]
worker.start_time="2019-01-01"
worker.end_time="2019-01-31"
Finace.calc_salary(worker)
"""
import xlwt
import xlrd
import os
import datetime
import re
from homework.log.cala_salary_log import TNLog
from xlutils.copy import copy
class Excel:
def __init__(self):
pass
def work_basic_info_sheet(self,file_dir,sheet_name,value_title):
path = os.path.exists(file_dir)
if path == False :
return Excel.work_write_excel_xls(self,file_dir, sheet_name, value_title)
def work_write_excel_xls(self,file_dir, sheet_name,value):
index = len(value) # 获取需要写入数据的行数
workbook = xlwt.Workbook() # 新建一个工作簿
sheet = workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
sheet.write(i, j, value[i][j]) # 像表格中写入数据(对应的行和列)
workbook.save(file_dir) # 保存工作簿
print("xls格式表格创建成功!")
return True
def write_excel_xls_append(self,path, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
new_worksheet.write(i + rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入
new_workbook.save(path) # 保存工作簿
print("xls格式表格【追加】写入数据成功!")
return True
class Finace(object):
def __init__(self,worker):
self.worker = worker
def calc_salary(self):
date_end = datetime.datetime.strptime(worker.end_time, '%Y-%m-%d')
date_start = datetime.datetime.strptime(worker.start_time, '%Y-%m-%d')
salary_date = worker.end_time[:7]
diff = ((date_end - date_start) / 7).days
sum_salary = 0
r = []
l = len(worker.work_and_salary_list)
for k,salary_job in enumerate(worker.work_and_salary_list):
salary = re.findall ('[0-9.]+',str(salary_job))[0]#工资
pat = re.compile(r'[\u4e00-\u9fa5]+')
jobs = pat.findall(str(salary_job))#工作
intrs = '工资结算%d周' % (diff)
if l > 1:
if k==0:
v = [[worker.work_id, salary_date, worker.name, worker.info, jobs, salary, intrs, '']]
sum_salary += float(salary)
else:
sum_salary += float(salary)
v = [[worker.work_id, salary_date, worker.name, worker.info, jobs, salary, intrs, sum_salary]]
else:
sum_salary += float(salary)
v = [[worker.work_id, salary_date, worker.name, worker.info, jobs, salary, intrs, sum_salary]]
r = r + v
return r
class Worker:
def __init__(self):
pass
if __name__ == "__main__":
try:
logger = TNLog()
ex = Excel()
work_xls = "xls格式员工工资信息表.xls"
book_name_xls = 'xls格式员工工资簿.xls'
value_title = [["员工编号", "工资结算时间", "员工姓名", "员工基本信息", "岗位", "工资", "说明", "工资总计"], ]
#建立员工基本信息表
basc_info = ex.work_basic_info_sheet(work_xls,book_name_xls, value_title)
worker = Worker()
worker.work_id = 1
worker.name = "小A"
worker.info = "住在回龙观"
worker.work_and_salary_list = [{"扫地d",2000.5},{"出纳",1000}]
worker.start_time = "2019-01-01"
worker.end_time = "2019-01-31"
# worker = Worker()
# worker.work_id = 2
# worker.name = "小B"
# worker.info = "住在泰国"
# worker.work_and_salary_list = [{"会计", 2000},{"扫地",1000}]
# worker.start_time = "2019-01-01"
# worker.end_time = "2019-01-31"
finace = Finace(worker)
rs = finace.calc_salary()
# 计算员工工资追加到员工工资表中
ex.write_excel_xls_append(work_xls, rs)
logger.info(rs)
except Exception as e:
logger.error(e)
#!/usr/bin/env python3
#-*- coding:utf-8-*-
#1、定义一个函数,接受两个参数,第一个参数是原始图片文件,第二个参数是复制到的路径
# def copy_image(source_file,target_path):
# 实现图片文件的复制
import os
import shutil
def copy_image(source_file,target_path):
#返回源文件夹的列表
source_list = os.listdir(source_file)
#生成新文件夹名
name ='class'
new_dir_name = os.path.join(target_path,name)
#创建新文件夹
if not os.path.exists(new_dir_name):
os.makedirs(new_dir_name)
for file in source_list:
file = os.path.join(source_file,file)
# 拷贝文件夹下的所有图片
if os.path.isfile(file):
if (file.find(".jpg") > 0 or file.find(".png") > 0 or file.find(".jpeg") > 0 or file.find(".bmp") > 0) :
shutil.copy(file,new_dir_name)
print(new_dir_name + '/'+file + ' copy sucess'+'\n')
return True
old_path = 'F:/old_file'
new_path = 'F:/new_file/'
try:
r = copy_image(old_path,new_path)
except Exception as e:
print(e)
finally:
print("拷贝结束!")
\ No newline at end of file
#!/usr/bin/env python3
#-*- coding:utf-8-*-
#请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,
# 你将只被给定要求被删除的节点。现有一个链表 -- head = [4,5,1,9],
# 它可以表示为:
#输入: head = [4,5,1,9], node = 5输出: [4,1,9]
# 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
import re
class Solution(object):
def __init__(self):
pass
#重新建新列表
def deleteNode(self,xlist,node):
output = []
if node == None:
input("请输入要删除的结点: ")
else:
if node == xlist[-1]:
print("不能删除未尾结点:")
exit(0)
if node not in xlist:
print("找不到您要删除的结点:")
exit(0)
else:
xlist = self.Str2Int(xlist)
xxlist = list(set(xlist))#去重复
xxlist.sort(key = xlist.index)#按原样输出
for i in xxlist:
if i!= int(node):
output.append(i)
return output
#转化为列表整数
def Str2Int(self,str):
xlist = str.split(",")
xlist = [int(xlist[i]) for i in range(len(xlist))]
return xlist
if __name__ == '__main__':
x = input("请输入链表结点,数字与半角逗号分隔 ,结点不能少于2个 ")
if not re.search('^[0-9,]+$', x):
print('格式错误 ')
exit(0)
s = Solution()
n = input("请输入要删除的结点: ")
if not re.search('^[0-9]+$', n):
print('格式错误')
exit(0)
r = s.deleteNode(x,n)
print(r)
\ No newline at end of file
#!/usr/bin/env python3
#-*- coding:utf-8-*-
import xlwt
import xlrd
from xlutils.copy import copy
# 4个参数,分别对应文件名称,sheet名称,行号,列号,返回值是获取到的内容
def read_excel(excel_file, sheet_name, row_num = 0,col_num = 0):
workbook = xlrd.open_workbook(excel_file) # 打开工作簿
print("读取的内容为:")
print("-----------")
if (row_num != 0 and col_num !=0):
sheets = workbook.sheet_by_index(0)
print(sheets.cell(row_num, col_num).value) # 读取指定行和列获取数据
else:
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
for i in range(0, worksheet.nrows):
for j in range(0, worksheet.ncols):
print(worksheet.cell_value(i, j), "\t", end="") # 逐行逐列读取数据
print()
def write_excel(excel_file,sheet_name,row_num,col_num,content):
index = len(content) # 获取需要写入数据的行数
workbook = xlwt.Workbook() # 新建一个工作簿
sheet = workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格
#sheet.write(row_num,col_num,content[0][0])向某行某列写入内容
for i in range(0, index):
for j in range(0, len(content[i])):
sheet.write(i, j, content[i][j]) # 像表格中写入数据(对应的行和列)
workbook.save(excel_file) # 保存工作簿
print("xls格式表格写入数据成功!")
return content
#追加内容
def write_excel_xls_append(path, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
new_worksheet.write(i + rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入
new_workbook.save(path) # 保存工作簿
print("xls格式表格【追加】写入数据成功!")
#写入内容
book_name_xls = 'xls测试格式测试工作簿.xls'
sheet_name_xls = 'xls测试格式测试表'
value_title = [["姓名", "性别", "年龄", "城市", "职业"], ]
value1 = [["张三", "男", "19", "杭州", "研发工程师"],
["李四", "男", "22", "北京", "医生"],
["王五", "女", "33", "珠海", "出租车司机"], ]
rows_num = 3
col_num = 3
write_excel(book_name_xls,sheet_name_xls,rows_num,col_num,value_title)
write_excel_xls_append(book_name_xls, value1)
#读取内容
try:
#当rows_num col_num 值为0则读取所有,否则读取指定行列内容
read_excel(book_name_xls,sheet_name_xls,rows_num,col_num)
except FileNotFoundError as e:
print("读取发生异常了")
finally:
print("---------")
print("读取完毕")
#!/usr/bin/env python3
#-*- coding:utf-8-*-
"""
2、自学文件判断、文件夹判断方法,完成函数get_files,能够递归的获取到给定文件或文件夹下的所有文件
这里要考虑,给定的参数file_path是文件还是文件夹,如果是文件则直接列出来文件名称就可以
如果是文件夹,那么要列出这个文件夹下所有的文件名称,同时要考虑,文件夹下是否还有文件夹
直到保证此文件夹下再不包含文件夹,列出所有的文件名称即可
# 每当读取一个文件夹时,打一个info级别的log,标记开始读取哪个文件夹
"""
import os
from homework.log.file_log import TNLog
def get_files(file_path):
if os.path.exists(file_path):#判断文件是否存在
if os.path.isdir(file_path):#判断是否为目录
source_dir = os.listdir(file_path)
for parents_file in source_dir:#列出文件夹下的所有文件以及文件夹
child_file = os.path.join(file_path,parents_file)
if os.path.isdir(child_file):#如为文件夹进行递归
logger.info("开始读取的文件夹为:" + child_file + '\n')
get_files(child_file)
else:
print_file = '列出的文件为:%s' % (child_file) + '\n'
logger.info(print_file)
elif os.path.isfile(file_path):
print('列出的文件为:%s' % (file_path) +'\n')
else:
print ("it's a special file")
else:
print("file or dir not exists")
if __name__ == "__main__":
old_path = 'F:/new_file'
logger = TNLog()
r = get_files(old_path)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
该日志类可以把不同级别的日志输出到不同的日志文件中
"""
import os
import sys
import time
import logging
import inspect
handlers = {logging.NOTSET: "cala_salary-notset.log",
logging.DEBUG: "cala_salary-debug.log",
logging.INFO: "cala_salary-info.log",
logging.WARNING: "cala_salary-warning.log",
logging.ERROR: "cala_salary-error.log",
logging.CRITICAL: "cala_salary-critical.log"}
def createHandlers():
logLevels = handlers.keys()
for level in logLevels:
path = os.path.abspath(handlers[level])
handlers[level] = logging.FileHandler(path)
# 加载模块时创建全局变量
createHandlers()
class TNLog(object):
def printfNow(self):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
def __init__(self, level=logging.NOTSET):
self.__loggers = {}
logLevels = handlers.keys()
for level in logLevels:
logger = logging.getLogger(str(level))
# 如果不指定level,获得的handler似乎是同一个handler?
logger.addHandler(handlers[level])
logger.setLevel(level)
self.__loggers.update({level: logger})
def getLogMessage(self, level, message):
frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[2]
'''日志格式:[时间] [类型] [记录代码] 信息'''
return "[%s] [%s] [%s - %s - %s] %s" % (self.printfNow(), level, filename, lineNo, functionName, message)
def info(self, message):
message = self.getLogMessage("info", message)
self.__loggers[logging.INFO].info(message)
def error(self, message):
message = self.getLogMessage("error", message)
self.__loggers[logging.ERROR].error(message)
def warning(self, message):
message = self.getLogMessage("warning", message)
self.__loggers[logging.WARNING].warning(message)
def debug(self, message):
message = self.getLogMessage("debug", message)
self.__loggers[logging.DEBUG].debug(message)
def critical(self, message):
message = self.getLogMessage("critical", message)
self.__loggers[logging.CRITICAL].critical(message)
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
该日志类可以把不同级别的日志输出到不同的日志文件中
"""
import os
import sys
import time
import logging
import inspect
handlers = {
logging.INFO: "get_file-info.log",
}
def createHandlers():
logLevels = handlers.keys()
for level in logLevels:
path = os.path.abspath(handlers[level])
handlers[level] = logging.FileHandler(path)
# 加载模块时创建全局变量
createHandlers()
class TNLog(object):
def printfNow(self):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
def __init__(self, level=logging.NOTSET):
self.__loggers = {}
logLevels = handlers.keys()
for level in logLevels:
logger = logging.getLogger(str(level))
# 如果不指定level,获得的handler似乎是同一个handler?
logger.addHandler(handlers[level])
logger.setLevel(level)
self.__loggers.update({level: logger})
def getLogMessage(self, level, message):
frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[2]
'''日志格式:[时间] [类型] [记录代码] 信息'''
return "[%s] [%s] [%s - %s - %s] %s" % (self.printfNow(), level, filename, lineNo, functionName, message)
def info(self, message):
message = self.getLogMessage("info", message)
self.__loggers[logging.INFO].info(message)
def error(self, message):
message = self.getLogMessage("error", message)
self.__loggers[logging.ERROR].error(message)
def warning(self, message):
message = self.getLogMessage("warning", message)
self.__loggers[logging.WARNING].warning(message)
def debug(self, message):
message = self.getLogMessage("debug", message)
self.__loggers[logging.DEBUG].debug(message)
def critical(self, message):
message = self.getLogMessage("critical", message)
self.__loggers[logging.CRITICAL].critical(message)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment