关于python的calendar包打印

发布时间:2019-08-25 09:34:26编辑:auto阅读(1217)

    背景

    最近又开始捡起之前看得python,calendar这个之前没有看到这,今早看到了,想进一步学习一下。

    我的python版本3.4.3.


    场景1:

    没有什么特殊需求,直接输出日历。代码如下:

    # -*- encoding = utf-8 -*-
    
    import calendar
    
    print ("Below is year 2016 calendar: ")
    for i in range(1,13):
    	cal = calendar.month(2016, i)
    	print(cal)

    输出结果如下所示:
    Below is year 2016 calendar: 
        January 2016
    Mo Tu We Th Fr Sa Su
                 1  2  3
     4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
    
       February 2016
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29
    
         March 2016
    Mo Tu We Th Fr Sa Su
        1  2  3  4  5  6
     7  8  9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30 31
    
         April 2016
    Mo Tu We Th Fr Sa Su
                 1  2  3
     4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30
    
          May 2016
    Mo Tu We Th Fr Sa Su
                       1
     2  3  4  5  6  7  8
     9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30 31
    
         June 2016
    Mo Tu We Th Fr Sa Su
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30
    
         July 2016
    Mo Tu We Th Fr Sa Su
                 1  2  3
     4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
    
        August 2016
    Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31
    
       September 2016
    Mo Tu We Th Fr Sa Su
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30
    
        October 2016
    Mo Tu We Th Fr Sa Su
                    1  2
     3  4  5  6  7  8  9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31
    
       November 2016
    Mo Tu We Th Fr Sa Su
        1  2  3  4  5  6
     7  8  9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30
    
       December 2016
    Mo Tu We Th Fr Sa Su
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    

    场景2:看到上面的输出,觉得还是可以优化一下,按季度输出,每一排输出3个月的日历。最终呈现 4X3 的格局。

    查看了网上资料,参考了一下Python 3.4.3 documentation,代码很简单。如下:

    # -*- encoding = utf-8 -*-
    
    import calendar
    
    print ("Below is year 2016 calendar: ")
    calendar.prcal(2016)
    


    输出结果:

    Below is year 2016 calendar: 
                                      2016
    
          January                   February                   March
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3       1  2  3  4  5  6  7          1  2  3  4  5  6
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       7  8  9 10 11 12 13
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      14 15 16 17 18 19 20
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      21 22 23 24 25 26 27
    25 26 27 28 29 30 31      29                        28 29 30 31
    
           April                      May                       June
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3                         1             1  2  3  4  5
     4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                              30 31
    
            July                     August                  September
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3       1  2  3  4  5  6  7                1  2  3  4
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30
    
          October                   November                  December
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                    1  2          1  2  3  4  5  6                1  2  3  4
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
    31
    
    

    问题:

    1.python中的range()是左闭右开的范围,即[1,13)这样的意思,起初写的是range(1,12),少打印了12月份的信息。

    2.print(calendar.prcal(2016))打印的最后结果输出了一个None字符,不知道什么原因,最后直接calendar.prcal(2016)进行打印。

      询问了别人,大体明白了为什么了。calendar.prcal(year)就像自身内部已经调用了一个 print了,就会出现这个问题。比如下面的:

    >>> print (print ("hello"))
    hello
    None

    实质的原因是,calendar.prcal(year)里直接print了。证据如下:
    >>> help(calendar.prcal)
    Help on method pryear in module calendar:
    
    pryear(theyear, w=0, l=0, c=6, m=3) method of calendar.TextCalendar instance
        Print a year's calendar.

    而print(calendar.month(2016,3))时没有打印出none,原因是方法里是一个return。如下:
    >>> help(calendar.month)
    Help on method formatmonth in module calendar:
    
    formatmonth(theyear, themonth, w=0, l=0) method of calendar.TextCalendar instance
        Return a month's calendar string (multi-line).
    



    场景3:作为中国人,大家默认周一才是每周的开始,而西方人则认为周天是每周的开始。尝试修改代码,调查发现,calendar中有一个setfirstweekday()的方法,weekday的范围是 0 (Monday) to 6 (Sunday).代码如下:

    # -*- encoding = utf-8 -*-
    
    import calendar
    
    print ("Below is year 2016 calendar: ")
    calendar.setfirstweekday(6)
    calendar.prcal(2016)
    


    输出如下:

    Below is year 2016 calendar: 
                                      2016
    
          January                   February                   March
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                    1  2          1  2  3  4  5  6             1  2  3  4  5
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       6  7  8  9 10 11 12
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      13 14 15 16 17 18 19
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      20 21 22 23 24 25 26
    24 25 26 27 28 29 30      28 29                     27 28 29 30 31
    31
    
           April                      May                       June
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                    1  2       1  2  3  4  5  6  7                1  2  3  4
     3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30
    
            July                     August                  September
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                    1  2          1  2  3  4  5  6                   1  2  3
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
    24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
    31
    
          October                   November                  December
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                       1             1  2  3  4  5                   1  2  3
     2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
     9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
    16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
    23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
    30 31

    扩展:

    1. 调查对比了一下python2.6跟python3.4.3中,关于calendar.prcal方法入力参数的取值上限,python2.6是9998,python3.4.3是9999,但当入力是9999的时候,python3.4.3的结果显示有问题,12月份的最后一周的启示不正确。

    python2.6

    >>> calendar.prcal(9998)
                                      9998
    
          January                   February                   March
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                 1  2  3       1  2  3  4  5  6  7       1  2  3  4  5  6  7
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
    25 26 27 28 29 30 31                                29 30 31
    
           April                      May                       June
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
              1  2  3  4                      1  2          1  2  3  4  5  6
     5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
    12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
    19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
    26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                              31
    
            July                     August                  September
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
              1  2  3  4                         1             1  2  3  4  5
     5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                              30 31
    
          October                   November                  December
    Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa      Su Mo Tu We Th Fr Sa
                 1  2  3       1  2  3  4  5  6  7             1  2  3  4  5
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
    25 26 27 28 29 30 31      29 30                     27 28 29 30 31

    python3.4.3 -9999

    >>> calendar.prcal(9999)
                                      9999
    
          January                   February                   March
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3       1  2  3  4  5  6  7       1  2  3  4  5  6  7
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
    25 26 27 28 29 30 31                                29 30 31
    
           April                      May                       June
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
              1  2  3  4                      1  2          1  2  3  4  5  6
     5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
    12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
    19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
    26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                              31
    
            July                     August                  September
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
              1  2  3  4                         1             1  2  3  4  5
     5  6  7  8  9 10 11       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    12 13 14 15 16 17 18       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    19 20 21 22 23 24 25      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    26 27 28 29 30 31         23 24 25 26 27 28 29      27 28 29 30
                              30 31
    
          October                   November                  December
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3       1  2  3  4  5  6  7             1  2  3  4  5
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       6  7  8  9 10 11 12
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      20 21 22 23 24 25 26
    25 26 27 28 29 30 31      29 30                        27 28 29 30 31

    但使用calender.month(9999,12)单独打印的时候,就没有问题,晕菜,给report@bugs.python.org发邮件去确认,希望是我的问题。

    >>> print (calendar.month(9999,12))
       December 9999
    Mo Tu We Th Fr Sa Su
           1  2  3  4  5
     6  7  8  9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31

    具体的现象可以参考这个链接:http://bugs.python.org/file44788/20160923154147.png


    现在已经确认,就是一个BUG,可惜自己刚学python,只能充当吃瓜群众了,看着大牛人在BUG list中激烈的讨论。

    bug url

    BUG-28253:calendar.prcal(9999) output has a problem

    http://bugs.python.org/issue28253

    --- over ---

关键字