2021-05-31 16:06发布
按月输出本年日历,星期日在前,并将上述日历输出至文件 。
ics文件是日历软件中很常见的格式,可以将日历账户中的日程安排导出成.ics文件,也可以将.ics文件中的事件导入到日历中。那么我们如何使用python来生成Ics文件呢?我们可以先找一个ics文件,用文本的方式来打开这个文件,看看一个,ics文件里都包含了那些信息,我们使用python拼凑出相同格式的信息,写入文本文件并且使用ics后缀结尾不就可以了吗?
这是我在日历中创建日程事件之后导出的.ics文件中的片段:
BEGIN:VCALENDARPRODID:-//ZHONG_BAI_REN//APPGENIX-SOFTWARE//VERSION:2.0CALSCALE:GREGORIANMETHOD:PUBLISHX-WR-CALNAME:my_scheduleX-WR-TIMEZONE:nullBEGIN:VEVENTSUMMARY:工程电磁场ORGANIZER;CN=My Calendar:mailto:nobody@gmail.comDTSTART;TZID=Asia/Shanghai:20190513T082000DTEND;TZID=Asia/Shanghai:20190513T095500DTSTAMP:20190221T202219ZUID:20190221T202219Z-11@appgenix-software.comSEQUENCE:0CREATED:20190221T202219ZDESCRIPTION:李风从-主讲LAST-MODIFIED:20190221T202219ZLOCATION:2-006STATUS:CONFIRMEDTRANSP:OPAQUEEND:VEVENTEND:VCALENDAR
从这个代码片段就可以看出ics文件的大致结构,文件以BEGIN:VCALENDAR开头,END:VCALENDAR结尾,事件以BEGIN:VEVENT开头,以END:VEVENT结尾。仔细查看了各个字段名称和字段后面的内容后可以猜知道每个字段的含义,再根据每个字段的含义来编写python代码。 贴上代码:
1 import datetime,os 2 3 class Event: 4 """ 5 事件对象 6 """ 7 def __init__(self,kwargs): 8 self.event_data = kwargs 9 10 def __turn_to_string__(self):11 self.event_text = "BEGIN:VEVENT\n"12 for item,data in self.event_data.items():13 item = str(item).replace("_","-")14 if item not in ["ORGANIZER","DTSTART","DTEND"]:15 self.event_text += "%s:%s\n"%(item,data)16 else:17 self.event_text += "%s;%s\n"%(item,data)18 self.event_text += "END:VEVENT\n"19 return self.event_text20 21 class Calendar:22 """23 日历对象24 """25 def __init__(self,calendar_name="My Calendar"):26 self.__events__ = {}27 self.__event_id__ = 028 self.calendar_name = calendar_name29 30 def add_event(self,**kwargs):31 event = Event(kwargs)32 event_id = self.__event_id__33 self.__events__[self.__event_id__] = event34 self.__event_id__ += 135 return event_id36 37 def modify_event(self,event_id,**kwargs):38 for item,data in kwargs.items():39 self.__events__[event_id].event_data[item] = data40 41 def remove_event(self,event_id):42 self.__events__.pop(event_id)43 44 def get_ics_text(self):45 self.__calendar_text__ = """BEGIN:VCALENDAR\nPRODID:-//ZHONG_BAI_REN//APPGENIX-SOFTWARE//\nVERSION:2.0\nCALSCALE:GREGORIAN\nMETHOD:PUBLISH\nX-WR-CALNAME:%s\nX-WR-TIMEZONE:null\n"""%self.calendar_name46 for key,value in self.__events__.items():47 self.__calendar_text__ += value.__turn_to_string__()48 self.__calendar_text__ += "END:VCALENDAR"49 return self.__calendar_text__50 51 def save_as_ics_file(self):52 ics_text = self.get_ics_text()53 open("%s.ics"%self.calendar_name,"w",encoding="utf8").write(ics_text)#使用utf8编码生成ics文件,否则日历软件打开是乱码54 55 def open_ics_file(self):56 os.system("%s.ics"%self.calendar_name)57 58 def add_event(cal, SUMMARY, DTSTART, DTEND, DESCRIPTION, LOCATION):59 """60 向Calendar日历对象添加事件的方法61 :param cal: calender日历实例62 :param SUMMARY: 事件名63 :param DTSTART: 事件开始时间64 :param DTEND: 时间结束时间65 :param DESCRIPTION: 备注66 :param LOCATION: 时间地点67 :return:68 """69 time_format = "TZID=Asia/Shanghai:{date.year}{date.month:0>2d}{date.day:0>2d}T{date.hour:0>2d}{date.minute:0>2d}00"70 dt_start = time_format.format(date=DTSTART)71 dt_end = time_format.format(date=DTEND)72 create_time = datetime.datetime.today().strftime("%Y%m%dT%H%M%SZ")73 cal.add_event(74 SUMMARY=SUMMARY,75 ORGANIZER="CN=My Calendar:mailto:nobody@gmail.com",76 DTSTART=dt_start,77 DTEND=dt_end,78 DTSTAMP=create_time,79 UID="{}-11@appgenix-software.com".format(create_time),80 SEQUENCE="0",81 CREATED=create_time,82 DESCRIPTION=DESCRIPTION,83 LAST_MODIFIED=create_time,84 LOCATION=LOCATION,85 STATUS="CONFIRMED",86 TRANSP="OPAQUE"87 )88 89 if __name__ == '__main__':90 calendar = Calendar(calendar_name="test")91 add_event(calendar,92 SUMMARY="测试",93 DTSTART=datetime.datetime(year=2019,month=2,day=19,hour=21,minute=21,second=00),94 DTEND=datetime.datetime(year=2019,month=2,day=19,hour=21,minute=30,second=00),95 DESCRIPTION="测试事件",96 LOCATION="我也不知道在哪儿")97 print(calendar.get_ics_text())98 calendar.save_as_ics_file()
代码的使用方法:
1.创建Calendar日历对象,传入可选参数“calendar_name”(同时也是生成的ics文件名,不传入则为默认值“My Calendar”) 2.调用add_event方法,第一个参数传入上一步的Calendar实例,然后依次传入 参数作用 参数名 参数类型 日历对象 cal Calender对象 事件名称 SUMMARY 字符串类型 事件开始时间 DTSTART datetime类型 事件结束时间 DTEND datetime类型 事件发生地点 LOCATION 字符串类型 事件备注 DESCRIPTION 字符串类型 3.调用Calendar实例的save_as_ics_file()方法,即可在代码的工作目录里生成一个ics文件 4.使用电脑或者手机等的日历软件的导入功能,即可将事件导入到日历的日程中。
# 输出日历界面 print("*" * 50) print("欢迎使用【天天日历】v2.0") # 接收用户输入的年份 year_int = int(input("请输入年份:\n")) # 定义全局变量用于记录天数总和 sum = 0 if year_int >= 1917: month_int = int(input("请输入月份\n")) for year_every in range(1917, year_int): # 遍历从1917年到用户输入年份 用于计算到用户所输入年份共多少天 if (year_every % 4 == 0 and year_every % 100 != 0) or \ year_every % 400 == 0: # 如果是瑞年则366天否则平年365天 sum += 366 else: sum += 365 for month_every in range(1, month_int): # 遍历月份用于计算由1月份到用户输入月份的总天数 if month_every == 4 or month_every == 6 or \ month_every == 9 or month_every == 11: sum += 30 elif month_every == 2: if (year_int % 1 == 0 and year_int % 100 != 0) or \ year_int % 400 == 0: sum += 29 else: sum += 28 else: sum += 31 # 定义变量用于定义每个月的天数 day = 0 # 定义变量 用于计算当月第一天为周几 weak = sum % 7 print("日\t一\t二\t三\t四\t五\t六") # 判断用户输入月份为多少天 if month_int == 4 or month_int == 6 or month_int == 9 or month_int == 11: day = 30 elif month_int == 2: if (year_int % 4 == 0 and year_int % 100 != 0) or \ year_int % 400 == 0: day = 29 else: day = 28 else: day = 31 # 输出指定空格数让第一天与周几对齐 print("\t"*weak,end="") i = 1 while i <= day: # 遍历用户查询月份 weakend = ((sum+i)-1)% 7 # 如果余数为6 换行否则输出空格 if weakend == 6: print("%d" %i) else: print(i,end="\t") i += 1 else: print("系统正在维护暂时无法获取1917年之前的信息")
话不多说,直接上图
dataframe推荐直接存成csv文件格式data.to_csv('file_name.csv')这样就可以了,如果遇到中文编码报错再加编码格式就好了
程序设计图如下:
自下往上看:
is_leap_year 判断是否为闰年
get_num_of_days_in_month 获得每月的天数
get_total_num_of_days 获得自1800年1月1日以来经过的天数
get_start_day 获得每月1日为星期几
print_month_body 打印日历的数字部分
get_month_name 获得每月的名称
print_month_title 打印日历标题与头部部分
具体实现如下:
# coding=utf-8__author__ = 'Leonard'def is_leap_year(year): # 判断是否为闰年 if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True else: return Falsedef get_num_of_days_in_month(year, month): # 给定年月返回月份的天数 if month in (1, 3, 5, 7, 8, 10, 12): return 31 elif month in (4, 6, 9, 11): return 30 elif is_leap_year(year): return 29 else: return 28def get_total_num_of_day(year, month): # 自1800年1月1日以来过了多少天 days = 0 for y in range(1800, year): if is_leap_year(y): days += 366 else: days += 365 for m in range(1, month): days += get_num_of_days_in_month(year, m) return daysdef get_start_day(year, month): # 返回当月1日是星期几,由1800.01.01是星期三推算 return 3 + get_total_num_of_day(year, month) % 7# 月份与名称对应的字典month_dict = {1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December'}def get_month_name(month): # 返回当月的名称 return month_dict[month]def print_month_title(year, month): # 打印日历的首部 print ' ', get_month_name(month), ' ', year, ' ' print '-------------------------------------' print ' Sun Mon Tue Wed Thu Fri Sat 'def print_month_body(year, month): ''' 打印日历正文 格式说明:空两个空格,每天的长度为5 需要注意的是print加逗号会多一个空格 ''' i = get_start_day(year, month) if i != 7: print ' ', # 打印行首的两个空格 print ' ' * i, # 从星期几开始则空5*几个空格 for j in range(1, get_num_of_days_in_month(year, month)+1): print 'M' %j, # 宽度控制,4+1=5 i += 1 if i % 7 == 0: # i用于计数和换行 print ' ' # 每换行一次行首继续空格# 主函数部分year = int(raw_input("Please input target year:")) month = int(raw_input("Please input target month:")) print_month_title(year, month) print_month_body(year, month)
运行示例:
4楼写的是最简洁的,学习了
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下
最多设置5个标签!
ics文件是日历软件中很常见的格式,可以将日历账户中的日程安排导出成.ics文件,也可以将.ics文件中的事件导入到日历中。那么我们如何使用python来生成Ics文件呢?我们可以先找一个ics文件,用文本的方式来打开这个文件,看看一个,ics文件里都包含了那些信息,我们使用python拼凑出相同格式的信息,写入文本文件并且使用ics后缀结尾不就可以了吗?
这是我在日历中创建日程事件之后导出的.ics文件中的片段:
代码的使用方法:
1.创建Calendar日历对象,传入可选参数“calendar_name”(同时也是生成的ics文件名,不传入则为默认值“My Calendar”)
2.调用add_event方法,第一个参数传入上一步的Calendar实例,然后依次传入
参数作用 参数名 参数类型
日历对象 cal Calender对象
事件名称 SUMMARY 字符串类型
事件开始时间 DTSTART datetime类型
事件结束时间 DTEND datetime类型
事件发生地点 LOCATION 字符串类型
事件备注 DESCRIPTION 字符串类型
3.调用Calendar实例的save_as_ics_file()方法,即可在代码的工作目录里生成一个ics文件
4.使用电脑或者手机等的日历软件的导入功能,即可将事件导入到日历的日程中。
话不多说,直接上图
dataframe推荐直接存成csv文件格式
data.to_csv('file_name.csv')
这样就可以了,如果遇到中文编码报错再加编码格式就好了
程序设计图如下:
自下往上看:
is_leap_year 判断是否为闰年
get_num_of_days_in_month 获得每月的天数
get_total_num_of_days 获得自1800年1月1日以来经过的天数
get_start_day 获得每月1日为星期几
print_month_body 打印日历的数字部分
get_month_name 获得每月的名称
print_month_title 打印日历标题与头部部分
具体实现如下:
运行示例:
4楼写的是最简洁的,学习了
相关问题推荐
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下