python编写日历输出到文件

2021-05-31 16:06发布

按月输出本年日历,星期日在前,并将上述日历输出至文件 。

按月输出本年日历,星期日在前,并将上述日历输出至文件 。

7条回答

ics文件是日历软件中很常见的格式,可以将日历账户中的日程安排导出成.ics文件,也可以将.ics文件中的事件导入到日历中。那么我们如何使用python来生成Ics文件呢?我们可以先找一个ics文件,用文本的方式来打开这个文件,看看一个,ics文件里都包含了那些信息,我们使用python拼凑出相同格式的信息,写入文本文件并且使用ics后缀结尾不就可以了吗?

这是我在日历中创建日程事件之后导出的.ics文件中的片段:

 

BEGIN:VCALENDAR
PRODID:-//ZHONG_BAI_REN//APPGENIX-SOFTWARE//
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:my_schedule
X-WR-TIMEZONE:null
BEGIN:VEVENT
SUMMARY:工程电磁场
ORGANIZER;CN=My Calendar:mailto:nobody@gmail.com
DTSTART;TZID=Asia/Shanghai:20190513T082000
DTEND;TZID=Asia/Shanghai:20190513T095500
DTSTAMP:20190221T202219Z
UID:20190221T202219Z-11@appgenix-software.com
SEQUENCE:0
CREATED:20190221T202219Z
DESCRIPTION:李风从-主讲
LAST-MODIFIED:20190221T202219Z
LOCATION:2-006
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
END: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.使用电脑或者手机等的日历软件的导入功能,即可将事件导入到日历的日程中。


yjh
3楼 · 2021-06-03 18:30
# 输出日历界面

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年之前的信息")
灰机带翅膀
4楼 · 2021-08-20 16:19

话不多说,直接上图

image.png

嘿呦嘿呦拔萝卜
5楼 · 2021-08-21 19:26

dataframe推荐直接存成csv文件格式
data.to_csv('file_name.csv')
这样就可以了,如果遇到中文编码报错再加编码格式就好了

帅帅马
6楼 · 2021-08-29 17:16

程序设计图如下:


自下往上看:


  • 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)



运行示例:


一个Ai
7楼 · 2021-09-02 13:53

4楼写的是最简洁的,学习了

相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,&#39;\n&#39;是换行,&#39;\t&#39;是tab,&#39;\\&#39;是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open(&#39;3_2.txt&#39;,&#39;r&#39;)linecount=len(file.readlines())linecache.getline(&#39;3_2.txt&#39;,linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问