kleiner (Kommandozeilen)-Terminkalender

Code-Stücke können hier veröffentlicht werden.
Antworten
Crush
User
Beiträge: 44
Registriert: Montag 1. Mai 2006, 11:32

Hallo miteinander

Um einen einfachen überblick über Termine (z.B. Prüfungen, Geburtstage, etc.) zu erhalten, habe ich heute dieses kleine Programm gebastelt. Ich hoffe, dass der Code verständlich genug dokumentiert ist, sodass ich hier nichts weiter beschreibe und erklärä. Zusätzlich poste ich jedoch noch eine Beispiel-Termine-Datei.

Ach ja, gerade sehe ich folgendes: zuerst war das als "Geburtstage-Notier-Tool" gedacht um zu sehen, wer bald Geburtstag hat. Dabei habe ich logischerweise das Jahr nicht berücksichtigt (das Jahr steht also nur zu Darstellungszwecken hier, das Programm macht nichts damit ausser in die Standardausgabe schreiben). Das werde ich in den nächsten Tagen noch nachbessern.

pyremind.py

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#      pyremind.py
#
#      Copyright 2006 Claudio Corrodi <corrodi.claudio@gmail.com>
#
#      This program is free software; you can redistribute it and/or modify
#      it under the terms of the GNU General Public License as published by
#      the Free Software Foundation; either version 2 of the License, or
#      (at your option) any later version.
#
#      This program is distributed in the hope that it will be useful,
#      but WITHOUT ANY WARRANTY; without even the implied warranty of
#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#      GNU General Public License for more details.
#
#      You should have received a copy of the GNU General Public License
#      along with this program; if not, write to the Free Software
#      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#


'''
pyremind.py -- Programm, das Termine aus einer Liste liest und
diejenigen Termine, die in den naechsten n Monaten stattfinden,
in die Standardausgabe schreibt.

Dateien muessen folgende Syntax aufweisen:
mmdd|yyyy|Beschreibung

Das Pipe-Zeichen darf ausserdem nicht in der Beschreibung verwendet
werden.
'''

__revision__ = '0.15'
__author__ = 'Claudio Corrodi'

import time
import datetime
import sys

class List:
    '''
    foobar
    '''
    def __init__(self):
        self.data = []
        self.date = datetime.date(*time.localtime()[0:3])
    
    def open_file(self, source):
        '''
        Methode um eine Datei zu oeffnen und die Zeilen in einer Liste
        zu speichern. Dabei wird der Newline-Character entfernt und
        eine Zeile in drei Teile gespalten.
        '''
        src = open(source, 'r')
        data = src.readlines()
        src.close()
        
        for i in range(len(data)):
            data[i] = data[i].decode('utf-8').split(None, 1)
        
        for i in range(len(data)):
            data[i][1] = data[i][1].lstrip(' ').rstrip('\n')
        
        self.load(data)
        
        return True
    
    def load(self, source):
        '''
        Liste 'source' wird in 'self.data' gespeichert. Seperate
        Methode, da nicht unbedingt aus einer Datei gelesen werden
        muss. Die Liste muss jedoch als Elemente dreiteilige Listen
        mit dem Format ['yyyy-mm-dd', 'Beschreibung'] enthalten.
        '''
        self.data = source
        self.data.sort()
            
    def put(self, months=2):
        '''
        Die Methode 'put' schreibt die Geburtstage innerhalb der
        naechsten 'months' Monate in die Standardausgabe.
        '''
        today = self.date
        month = (self.date.month + months)
        year = self.date.year
        if month > 12:
            year = self.date.year + (month/12)
            month %= 12

        value = datetime.date(year, month, self.date.day)
        print value
        
        for i in range(len(self.data)):
            self.data[i][0] = self.data[i][0].split('-')
            self.data[i][0] = [int(t) for t in self.data[i][0]]
        
        put = []
        for i in self.data:
            comp = datetime.date(*i[0])
            if comp >= today and comp <= value:
                put.append(i)
        
        msg = 'Heutiges Datum: %s' % self.date
        print msg
        print len(msg)*'-'
        for i in put:
            print str(datetime.date(*i[0])) + ' -- ' + i[1].encode('utf-8')
        
        
if __name__ == '__main__':
    FOO = List()
    
    try:
        FOO.open_file(sys.argv[2])
    except IndexError:
        FOO.open_file('foobar.txt')

    try:
        FOO.put(int(sys.argv[1]))
    except IndexError:
        FOO.put(2)
foobar.txt

Code: Alles auswählen

2006-10-15 Termin 0
2006-11-30 Foobar
2007-01-01 neues Jahr ;)
2007-07-07 blubb
Gruss Crush

edit: achja: in der foobar.txt unbedingt eine neue Linie nach der letzten Zeile einfügen, da ansonsten ein Fehler entsteht (letztes Zeichen der letzten linie wird entfernt, auch wenn kein newline-character da ist)... ist noch nicht ganz sauber, wird auch noch verbessert ;)

edit2 (13.10.06): habe den Code noch etwas ergänzt (siehe Posts unten).
Zuletzt geändert von Crush am Freitag 13. Oktober 2006, 09:35, insgesamt 2-mal geändert.
BlackJack

Das kann man vielleicht mit `datetime.date` Objekten etwas kürzer und verständlicher schreiben.

Beim Format der Datei würde sich das Datum in der ISO-Schreibweise Jahr-Monat-Tag, also 2006-10-15 für den ersten Termin, eignen. Dann beliebig viele Leerzeichen, gefolgt von der Beschreibung. Man kann die Datei dann zeilenweise sortieren und hätte eine korrekte zeitliche Abfolge, die Zeilen liessen sich mit ``line.split(None, 1)`` in Datum und Beschreibung aufsplitten und man könnte auch jedes Zeichen ausser dem Zeilenwechsel in der Beschreibung verwenden.

Aus dem Datum könnte man dann mit ``datetime.date(*datepart.split('-'))`` ein Datumsobjekt erstellen was man mit ``<``, ``>`` und ``==`` einfach mit dem aktuellen Datumsobjekt vergleichen kann.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Um die Linefeeds loszuwerden kannst du strip oder rstrip verwenden. Da koenntest du zusaetzlich auch noch Leerzeichen am Anfang/Ende loswerden.
Crush
User
Beiträge: 44
Registriert: Montag 1. Mai 2006, 11:32

Hallo Rebecca und BlackJack

Danke für die Hinweise, ich habe das zur Kenntnis genommen und umgesetzt (ich habe das gleich im ersten Post geändert damit der Thread nicht mit ähnlichem Code vollgepumpt wird).

Crush
Antworten