清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
# -*- coding:utf-8 -*-
import datetime # , calendar
from copy import deepcopy
from BeautifulSoup import BeautifulSoup
#~ from pyquery import PyQuery as pq
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class Util(object):
"""
教案生成器,自动填写表头,产生 .doc 格式文档
"""
@classmethod
def read_config(cls):
""" 通过配置文件获取课程配置 """
conf = None
input_config = sys.argv[1] if len(sys.argv) > 1 else "conf.xml"
with open(input_config, 'rb') as conf_file:
soup = BeautifulSoup(conf_file.read(), fromEncoding="gbk")
conf = {'class': soup.find('class').text.strip(),
'lesson': soup.find('lesson').text.strip(),
'book': soup.find('book').text.strip(),
'press': soup.find('press').text.strip(),
'term': soup.find('term').text.strip(),
'year': soup.find('year').text.strip(),
'begin': soup.find('begin').text.strip(),
'weeks': int(soup.find('weeks').text),
'holiday': soup.find('holiday').text.strip(),
}
conf['holidays'] = [x.split(':') for x in conf['holiday'].split(',')]
# 日期条件检查器
always = lambda x: True
odd = lambda x: x % 2 == 1 # 单周
even = lambda x: x % 2 == 0
schedule = {}
for week in soup.findAll('week'):
func = always
if 'select' in week:
func = odd if odd(int(week['select'])) else even
schedule[int(week['n'])] = [func, week.text]
#~ {5:[f, '5, 6'], 3:[f, '3, 4'], 1:[f, '1, 2'], 6:[fo, '5, 6']}
conf['schedule'] = schedule
#~ print schedule.keys()
return conf
@classmethod
def holiday(cls, day, holidays):
""" 判断是否节假日 """
for hd in holidays:
begin = hd[0]
span = int(hd[1]) if len(hd) > 1 else 1
hdt = datetime.datetime.strptime(begin, "%Y-%m-%d")
if 0 < (day - hdt).days + 1 <= span:
return True
return False
@classmethod
def date_list(cls, begin_time, end_time, schedule):
""" 获取工作日列表 """
oneday = datetime.timedelta(days=1)
day_time = begin_time
work_weeks = schedule.keys()
while day_time <= end_time:
for it in work_weeks:
week = day_time.weekday() + 1
if week <= it:
day_time += datetime.timedelta(it - week)
week_ith = (day_time - begin_time).days / 7 + 1
#~ print 'week_th:', week_ith
#~ print day_time.strftime('%A, %Y-%m-%d')
#~ print "lessons:", schedule[it][1:]
# 日期条件检查
if schedule[it][0](week_ith):
yield day_time
day_time += oneday
@classmethod
def run(cls):
""" 生成教案 """
conf = cls.read_config()
with open("templet.dat", 'rb') as temp_file:
# read templet and generate
soup = BeautifulSoup(temp_file.read(), fromEncoding="gbk")
blank = soup.body.brTag # 指定Tag后缀写法
page = soup.body.div
page.find('span', {"name": "class"}).string = conf['class']
page.find('span', {"name": "lesson"}).string = conf['lesson']
page.find('span', {"name": "book"}).string = conf['book']
page.find('span', {"name": "press"}).string = conf['press']
page.find('span', {"name": "term"}).string = conf['term']
page.find('span', {"name": "year_range"}).string = conf['year']
begin_time = datetime.datetime.strptime(conf['begin'], "%Y-%m-%d")
end_time = begin_time + datetime.timedelta(days=conf['weeks']*7)
schedule = conf['schedule']
work_days = cls.date_list(begin_time, end_time, schedule)
for i, date in enumerate(work_days):
if cls.holiday(date, conf['holidays']):
print '-- skip holiday:', date.strftime('%Y-%m-%d')
continue
week = date.weekday() + 1
week_ith = (date - begin_time).days / 7 + 1
print "##", date.strftime('%Y-%m-%d'), '%s%s' % ("星期", CN_NUM[week]), "第", week_ith, "周"
page.find('span', {"name": "page_ith"}).string = str(i+1)
page.find('span', {"name": "week_ith"}).string = str(week_ith)
page.find('span', {"name": "lesson_ith"}).string = schedule[week][1]
page.find('span', {"name": "week"}).string = '%s%s' % ("星期", CN_NUM[week])
page.find('span', {"name": "year"}).string = str(date.year)
page.find('span', {"name": "month"}).string = '%02d' % date.month
page.find('span', {"name": "day"}).string = '%02d' % date.day
# 复制页面元素需要深拷贝,否则为移动元素
# 不能直接 insert str(page),因为 BS 会对其中 html 特殊字符转义
page = deepcopy(page)
soup.body.insert(len(soup.body), page)
blank = deepcopy(blank)
soup.body.insert(len(soup.body), blank)
year_span = conf['year'].split()
# 长行字符串写法
out_file_name = ''.join((year_span[0], '-', year_span[-1], '-',
, conf['term'], '《' + conf['lesson'] + '》', '教案-教师', '.doc'))
with open(out_file_name, 'wb') as out_file:
out_file.write(str(soup))
if __name__ == '__main__':
CN_NUM = {
0: '零',
1: '一',
2: '二',
3: '三',
4: '四',
5: '五',
6: '六',
7: '七',
8: '八',
9: '九',
}
Util.run()