《JMU-json2ics》源码解读

曾神在群里分享了一个开源项目 《JMU-json2ics》 。可以用我们学校的课表生成 ics日历 文件。
这个小项目引发了我的兴趣,遂决定阅读一遍源码,顺便复习下python语法。

第一部分:json文件结构解读

总体结构

课程信息主要保存在 ”adminclass“ 条录下

{
  "studentTableVm": {
    "id": 22471, 
    "name": "陈煜晗", //学生姓名
    "code": "2020*****104",//学生学号
    "grade": "2020", //年级
    "department": "计算机工程学院", //学院
    "major": "计算机科学与技术", //专业
    "adminclass": "计算2014",//班级
    "credits": 25.75, //学分
    "totalRetakeCredits": 0, //已确认学分
    "activities": [...], //!!!课程列表!!!。
    "lessonSearchVms": [...],//下列不表。
    "practiceLessonSearchVms": [...], 
    "arrangedLessonSearchVms":[...],
    "timeTableLayout": {"id": 1...},
    "courseTablePrintConfigs": [...],
    "lessonNamePrint": false
  }
}

课程信息 activities

以列表形式保存课程信息。
在这里插入图片描述
对于每一个课程,以字典形式保存基本信息

{
        "lessonId": 62937, //课程代号?
        "lessonCode": "D000607-0006",//课程编号
        "lessonName": "21-22-01大学英语三级综合06", //课程班名称
        "courseCode": "D000607",
        "courseName": "大学英语 (3)", //课程名称
        "weeksStr": "5~13(单)", //上课周次描述信息
        "weekIndexes": [5, 7, 9, 11, 13],//上课周次
        "room": "汉水0306",//教室
        "building": "庄汉水楼",//教学楼
        "campus": "主校区",//教学校区
        "weekday": 1,//周几上课
        "startUnit": 7,//第几节课开始
        "endUnit": 8,//第几节课结束
        "lessonRemark": null,//重修
        "teachers": ["林瑞芳"],//授课教师
        "courseType": null,//课程类型 默认?
        "credits": 2.5,//学分
        "periodInfo": {"total": 40...},//进阶信息,下表。
        "stdCount": 66,//学生人数
        "limitCount": 80,//限制人数
        "tableShowAdminclass": [...],
        "adminclassVms": [...],
        "activityRoomTypeSign": null,
        "activityRoomTimesOrUnits": null,
        "taskPeopleNum": null
},

”periodInfo“ 是课程的进阶信息。 这里没有用到,仅作猜测,不保证正确性。

"periodInfo": {
   "total": 40,
   "weeks": 16,
   "theory": 40,//课时
   "theoryUnit": "HOUR",//课时单位
   "requireTheory": 40,//要求课时
   "practice": null, //实践课时
   "practiceUnit": null,//实践课时单位
   "requirePractice": null,//需要实践课时
   "focusPractice": null,//需要实践课时单位
   "focusPracticeUnit": null,
   "dispersedPractice": null,
   "test": null,//小测
   "testUnit": null,//小测单位
   "requireTest": null,//要求小测
   "experiment": null,//实验课时
   "experimentUnit": null,//实验课时单位
   "requireExperiment": null,//要求实验课时
   "machine": null,//机器
   "machineUnit": null,//机器单位
   "requireMachine": null,//需要机器单位 (上机?)
   "design": null,//课程设计课时
   "designUnit": null,//课程设计课时单位
   "requireDesign": null,//要求课程设计课时
   "periodsPerWeek": 0, //每周周期
   "extra": null,//额外课时
   "extraUnit": null,//额外课时单位
   "requireExtra": null//要求额外课时
 },

第二部分 :《JMU-json2ics》源码解读

主程序

def getInformation(json_data):
    return json_data["studentTableVm"]["name"], json_data["studentTableVm"]["id"], json_data["studentTableVm"]["grade"], \
           json_data["studentTableVm"]["major"], json_data["studentTableVm"]["adminclass"]

def main():
    first_day_date_str = '2021-09-06' #开学日期。
    time_zone = pytz.timezone('Asia/Shanghai') #更改时区为亚洲/上海
    # 保存日历信息, Calendar 是常见的日历类。
    calendar = Calendar()
    #以UTF-8编码打开json文件。
    with open('data1.json', encoding='utf-8') as f:
    	#读取json文件信息,以字典形式保存在json_data中
        json_data = json.load(f)
        #依次获取 姓名、学号、年级、专业、班级
        name, studentId, grade, major, class_name = getInformation(json_data)
        #读取课程列表
        courseList = json_data["studentTableVm"]["activities"]
        for course in courseList:... #(下接)

遍历课程

get_course_take_time

# 返回上课时间
def get_course_take_time(course_time):
    # 第1、2节课8:0:0 - 9:35:0 以此类推。
    course_time_table = {'12': [[8, 0, 0], [9, 35, 0]],
                         '34': [[10, 5, 0], [11, 40, 0]],
                         '14': [[8, 0, 0], [11, 40, 0]],

                         '56': [[14, 0, 0], [15, 35, 0]],
                         '78': [[15, 55, 0], [17, 30, 0]],
                         '58': [[14, 0, 0], [17, 30, 0]],

                         '910': [[19, 0, 0], [20, 35, 0]],
                         '911': [[19, 0, 0], [21, 25, 0]]}
    return course_time_table[course_time][0], course_time_table[course_time][1]
 for course in courseList:
 	# 课程在星期几
    course_in_day_of_week = int(course['weekday'])
    # 课程在第几周(列表形式)
    course_take_weeks = list(course['weekIndexes'])
    # 课程开始时间、结束时间
    course_begin_time, course_end_time = get_course_take_time(
         "{}{}".format(course['startUnit'], course['endUnit']))

    # 遍历上课周次
    for week in course_take_weeks:...#(下接)
	
	#生成 (class_name)-(name).ics文件
	output_file_name = '{} - {}.ics'.format(class_name, name)
    output_file = open(output_file_name, 'wb')
    #将calendar中的信息写入文件
    output_file.write(calendar.to_ical())
    output_file.close()
            

遍历课程的每一个周次

get_course_date

# 返回上课的日期
def get_course_date(first_day_date_str, course_in_day_of_week, which_week):
    first_day_date = datetime.datetime.strptime(
        first_day_date_str, r'%Y-%m-%d')
    return first_day_date + datetime.timedelta(days=(which_week - 1) * 7 + (course_in_day_of_week - 1))
 for week in course_take_weeks:
     course_date = get_course_date(first_day_date_str, course_in_day_of_week, week)
     # 注意这是icalendar中的Event
     # 创建一个事件(课程)
     event = Event()
     # 添加课程概述,这里只添加了课程名称
     event.add('summary', course['courseName'])
     #添加课程开始时间
     event.add('dtstart',
               datetime.datetime(course_date.year, course_date.month, course_date.day, course_begin_time[0],
                                 course_begin_time[1], course_begin_time[2], tzinfo=time_zone))
     #添加课程结束时间
     event.add('dtend',
               datetime.datetime(course_date.year, course_date.month, course_date.day, course_end_time[0],
                                 course_end_time[1], course_end_time[2], tzinfo=time_zone))
     #添加触发事件时间
     event.add('dtstamp',
               datetime.datetime(course_date.year, course_date.month, course_date.day, course_begin_time[0],
                                 course_begin_time[1], course_begin_time[2], tzinfo=time_zone))
     # 添加课程地点
     event.add('location', course['room'])
     # 将事件添加到日历中
     calendar.add_component(event)

完整源码及项目地址

源码

# -*- coding:utf-8 -*-
import requests
from icalendar import Calendar, Event
import pytz
import datetime
import hashlib
import os
import re

# 支持json
import json


# 返回上课的日期
def get_course_date(first_day_date_str, course_in_day_of_week, which_week):
    first_day_date = datetime.datetime.strptime(
        first_day_date_str, r'%Y-%m-%d')
    return first_day_date + datetime.timedelta(days=(which_week - 1) * 7 + (course_in_day_of_week - 1))


# 返回上课时间
def get_course_take_time(course_time):
    # 第1、2节课8:0:0 - 9:35:0 以此类推。
    course_time_table = {'12': [[8, 0, 0], [9, 35, 0]],
                         '34': [[10, 5, 0], [11, 40, 0]],
                         '14': [[8, 0, 0], [11, 40, 0]],

                         '56': [[14, 0, 0], [15, 35, 0]],
                         '78': [[15, 55, 0], [17, 30, 0]],
                         '58': [[14, 0, 0], [17, 30, 0]],

                         '910': [[19, 0, 0], [20, 35, 0]],
                         '911': [[19, 0, 0], [21, 25, 0]]}
    return course_time_table[course_time][0], course_time_table[course_time][1]


def getInformation(json_data):
    return json_data["studentTableVm"]["name"], json_data["studentTableVm"]["id"], json_data["studentTableVm"]["grade"], \
           json_data["studentTableVm"]["major"], json_data["studentTableVm"]["adminclass"]


def main():
    first_day_date_str = '2021-09-06'
    time_zone = pytz.timezone('Asia/Shanghai')
    # 保存日历信息
    calendar = Calendar()
    # 初始化?
    calendar.add('prodid', '-//My calendar product//mxm.dk//')
    calendar.add('version', '2.0')
    with open('data1.json', encoding='utf-8') as f:
        json_data = json.load(f)
        name, studentId, grade, major, class_name = getInformation(json_data)
        courseList = json_data["studentTableVm"]["activities"]
        print(type(courseList))
        for course in courseList:
            # 课程在星期几
            course_in_day_of_week = int(course['weekday'])
            # 课程在第几周(列表形式)
            course_take_weeks = list(course['weekIndexes'])
            # 课程开始时间、结束时间
            course_begin_time, course_end_time = get_course_take_time(
                "{}{}".format(course['startUnit'], course['endUnit']))

            # 遍历上课周次
            for week in course_take_weeks:
                course_date = get_course_date(first_day_date_str, course_in_day_of_week, week)
                event = Event()
                event.add('summary', course['courseName'])
                event.add('dtstart',
                          datetime.datetime(course_date.year, course_date.month, course_date.day, course_begin_time[0],
                                            course_begin_time[1], course_begin_time[2], tzinfo=time_zone))
                event.add('dtend',
                          datetime.datetime(course_date.year, course_date.month, course_date.day, course_end_time[0],
                                            course_end_time[1], course_end_time[2], tzinfo=time_zone))
                event.add('dtstamp',
                          datetime.datetime(course_date.year, course_date.month, course_date.day, course_begin_time[0],
                                            course_begin_time[1], course_begin_time[2], tzinfo=time_zone))
                event.add('location', course['room'])
                calendar.add_component(event)
            output_file_name = '{} - {}.ics'.format(class_name, name)
            output_file = open(output_file_name, 'wb')
            output_file.write(calendar.to_ical())
            output_file.close()


if __name__ == '__main__':
    main()

项目地址

tiny / JMU-json2ics

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 7-2 jmu-python-分段函数是指在Python编程语言中,实现分段函数的计算和绘制。分段函数是指在不同的区间内,函数的表达式不同。在Python中,可以使用if语句或者numpy库中的where函数来实现分段函数的计算。同时,也可以使用matplotlib库来绘制分段函数的图像。 ### 回答2: 7-2 jmu-python-分段函数是一道Python编程题目,要求我们编写一个程序,计算分段函数的值。分段函数是一种常用的数学函数形式,其定义域被划分为若干个子域,在每个子域里函数的表达式是不同的。 对于这个问题,我们可以采用Python语言编写一个函数来求解。具体来说,我们可以先将不同的子域分别处理成单独的函数,在不同的子域里分别调用不同的函数,最终得到分段函数的值。 首先,我们需要确定定义域并将其划分为不同的子域。假设我们需要求解的分段函数为f(x) = x^2-2x+1(x<1); f(x) = x+2 (1<=x<10); f(x) = x^3-20 (x>=10)。可以看出,定义域被分为了三个子域:x<1、1<=x<10、x>=10。 接下来,我们可以分别编写三个子函数,分别用来计算在不同子域内的函数值。对于每个子函数,我们需要传入一个参数x(x为定义域内的一个值),并返回对应函数在该点的函数值。 def func1(x): return x**2 - 2*x + 1 def func2(x): return x + 2 def func3(x): return x**3 - 20 最后,我们可以编写一个分段函数的总函数,根据输入的x的不同值,分别调用不同的函数进行计算。 def piecewise_function(x): if x < 1: return func1(x) elif 1 <= x <10: return func2(x) else: return func3(x) 这样,我们就可以通过调用piecewise_function来计算任意一个x在分段函数中的函数值。 ### 回答3: 7-2 jmu-python-分段函数 分段函数是指函数的定义域被分成多个区间,在每个区间内采用不同的函数表达式来表示函数的值。在图像上,分段函数表现出多段直线或曲线组成的形态。分段函数是高中数学中的一个重要概念,可以解决很多实际问题,如利润函数、收益函数等。 Python中可以通过if语句来实现分段函数的计算。首先要确定函数定义域的区间,然后在每个区间内使用不同的函数表达式计算函数值。具体实现过程如下: 1.确定函数的定义域区间,例如定义域为(-∞,2),[2,5),[5,+∞)。 2.定义一个函数名,例如f(x)。 3.使用if语句,在每个区间内使用不同的函数表达式计算函数值。 def f(x): if x<2: return x**2+3 elif x>=2 and x<5: return 2*x+1 else: return 4*x-3 4.调用函数,输入自变量x的值,求得函数值。 print(f(1)) # 输出4 print(f(3)) # 输出7 print(f(6)) # 输出21 上述代码中,函数f(x)的定义域被分成了三个区间:(-∞,2),[2,5),[5,+∞),并在每个区间内使用不同的函数表达式计算函数值。通过if语句的条件判断,可以实现对不同区间的函数表达式的选择。调用函数时,输入自变量x的值,就可以得到对应的函数值。 总之,Python中可以通过if语句实现分段函数的计算,这对于解决实际问题有很大的帮助。在编写代码时,需要注意定义域的分段和函数表达式的选择,以便正确计算函数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值