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)
Code: Alles auswählen
2006-10-15 Termin 0
2006-11-30 Foobar
2007-01-01 neues Jahr ;)
2007-07-07 blubb
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).