Archiv des Tags ‘Python’

Tabellenverlauf der Fußball Bundesliga, 1963 – 2008

Dienstag, den 6. April 2010

Die Tage zuvor hatte ich schon mit den Punkten rumgespielt, nun gibt es hier den gesamten Verlauf aller Spieltage von 1963 bis 2008 zu sehen. Selbstverstänlich habe ich wieder Python, die Google Chart API und pygooglechart verwendet.

1963 – 1964

(weiterlesen…)

Bundesliga 1963-2008 in Bildern

Sonntag, den 4. April 2010

Für eine Wettanalysesoftware brauchte ich sämtliche Spiele der Fussball Bundesliga seit der Gründung. Und da man an diese Daten recht simpel ran kommt, dachte ich mir heute das ich damit ja auch andere Dinge anstellen kann außer reich zu werden :) Hier mal sämtliche Saisons seit 1963 als Diagramm. Die X-Achse gibt die Spieltage wieder, die Y-Achse die Punkte. Als Berechnungfaktor habe ich konsequent 1 Punkt für Unentschieden, 3 Punkte für Sieg und 0 Punkte für eine Niederlage vergeben. Das ist zwar nicht historisch korrekt, aber ich wollte heute auch nicht allzulange vor dem Rechner sitzen :)

1963 – 1964

(weiterlesen…)

Mail.app mit Python steuern

Mittwoch, den 31. März 2010

Ich bin ein großer Fan von Mail.app. Die sqlitebasierte Suche ist super schnell und hilft mir im beruflichen Alltag ungemein. Da ich regelmäßig viele Dateien versenden muss, und nein, ich kann die nicht irgendwo zum Download anbieten, habe ich nach einer smarten Lösung gesucht um Mail.app von der Konsole aus zu steuern. Genauer gesagt wollte ich einen Skript haben das ich mit den benötigten Informationen wie div. Emfpänger, Betreff und eben jede Menge Dateien aufrufe. Das Skript öffnet anschließend Mail.app, erstellt eine neue Nachricht, trägt die Empfänger und den Betreff ein und fügt die Dateien als Anhänge hinzu.

Bei SuperUser.com wurde ich fündig:http://superuser.com/questions/125707/write-an-email-with-attachment-with-mail-app-from-terminal/. Doch wollte ich das ganz nicht mit nem billigen Shellskript sondern dauerhaft mit Python machen. Da kam mir appscript gerade recht.

Appscript bietet eine Schnittstelle zu Apple Script, sowohl für Ruby als auch für Python. Wuhuuu. Damit kann man so ziemlich jede Anwendung steuern, Stichwort Interprozesskommunikation, oder kurz IPC. Nach ein wenig Spielerei kam dabei das hier raus:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python
# encoding: utf-8
"""
mailapp.py
 
Created by Fabian Schächter on 2010-03-31.
Copyright (c) 2010 . All rights reserved.
"""

 
 
__author__ = 'Fabian Schächter <fabian@schaechter.info>'
__version__ = '0.1'
 
 
import optparse
import appscript
import mactypes
import os
 
 
def talk_to_mailapp(recipients, subject, files):
    """talks to mail.app through appscript"""
    mail = appscript.app('Mail')
    k = appscript.k
    message = mail.make(
        new=k.outgoing_message,
        with_properties={
            k.visible: True,
            k.subject: unicode(subject),
        }
    )
    for recipient in recipients:
        message.to_recipients.end.make(
            new=k.to_recipient,
            with_properties={
                k.address: recipient,
            }
        )
   
    if files is not None and len(files) > 0:
        for f in files:
            message.content.make(
                at=message.content.paragraphs.first.before,
                new=k.paragraph,
                with_data='nn',
            )
            file_path = os.path.realpath(f)
            app_file = mactypes.Alias(file_path)
            message.content.make(
                at=message.content.paragraphs.first.after,
                new=k.attachment,
                with_properties={
                    k.file_name: app_file,
                }
            )
 
 
def main():
    """main"""
    parser = optparse.OptionParser()
    parser.add_option(
        '-t',
        '--to',
        dest='recipient',
        action='append',
        help='recipient'
    )
    parser.add_option(
        '-s',
        '--subject',
        dest='subject',
        help='subject',
    )
    parser.add_option(
        '-f',
        '--file',
        dest='files',
        action='append',
        help='files to be added as an attachment'
    )
    (options, args) = parser.parse_args()
    if options.recipient == None:
        parser.error('recipient is required')
    if options.subject == None:
        parser.error('subject is required')
    talk_to_mailapp(options.recipient, options.subject, options.files)
 
 
if __name__ == '__main__':
    main()

Nun reicht mit ein einfaches mailapp.py -t aneine@addresse.de -t undnoch@eine.de -s “der betreff” -f datei1.txt -f datei2.txt -f datei3.txt und schon habe ich eine Mail in Mail.app angelegt und alle Dateien sind schon angehängt.

ClientForm mit HTML betanken

Sonntag, den 7. März 2010

Ich benötigte Informationen aus einem Formular einer Website. Dazu kann man wunderbar ClientForm verwenden. Doch ClientForm will entweder eine Datei oder den Response der urllib2. Doch ich hatte schon den Inhalt der Seite. Und da ich keinen weiteren Response erzeugen wollte habe ich mir einfach mit der Klasse TemporaryFile aus dem Modul tempfile geholfen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from ClientForm import ParseFile
import tempfile

# ...
# der ganze response/request-spass ist schon passiert
# die variable html existiert, ist ein string und enthält die ganze website


f = tempfile.TemporaryFile()
f.write(html)
# wichtig... zum den zeiger im tempfile wieder auf 0 setzten, sonst kann clientform das nicht
# korrekt parsen
f.seek(0)
forms =  ParseFile(f, '')
print forms
f.close()

Das angenehme an TemporaryFile, wenn der Zugriff mittels close() beendet wird, wird auch die Datei dahinter gelöscht. Man muss also nicht mal mehr den Müll rausbringen :)

Auflistung der nächsten 100 Tage in Python

Samstag, den 6. März 2010

Ich brauchte gerade eine Auflistung der kommen 100 Tage und ich wollte dafür nicht extra ein Tabellenkalkulationsmonster ala Excel aufmachen. Python bietet dafür genügend Zucker damit das Spaß macht:

1
2
3
4
5
6
7
8
9
10
11
12
from datetime import date, timedelta


def main():
    """spass mit daten"""
    start_date = date.today()
    for i in range(1, 100):
        print start_date + timedelta(days=i)


if __name__ == '__main__':
    main()

Und hier das Ergebnis:

1.: 2010-03-07
2.: 2010-03-08
3.: 2010-03-09
4.: 2010-03-10
5.: 2010-03-11
6.: 2010-03-12
7.: 2010-03-13
8.: 2010-03-14
9.: 2010-03-15
10.: 2010-03-16
11.: 2010-03-17
12.: 2010-03-18
13.: 2010-03-19
14.: 2010-03-20
15.: 2010-03-21
16.: 2010-03-22
17.: 2010-03-23
18.: 2010-03-24
19.: 2010-03-25
20.: 2010-03-26
21.: 2010-03-27
22.: 2010-03-28
23.: 2010-03-29
24.: 2010-03-30
25.: 2010-03-31
26.: 2010-04-01
27.: 2010-04-02
28.: 2010-04-03
29.: 2010-04-04
30.: 2010-04-05
31.: 2010-04-06
32.: 2010-04-07
33.: 2010-04-08
34.: 2010-04-09
35.: 2010-04-10
36.: 2010-04-11
37.: 2010-04-12
38.: 2010-04-13
39.: 2010-04-14
40.: 2010-04-15
41.: 2010-04-16
42.: 2010-04-17
43.: 2010-04-18
44.: 2010-04-19
45.: 2010-04-20
46.: 2010-04-21
47.: 2010-04-22
48.: 2010-04-23
49.: 2010-04-24
50.: 2010-04-25
51.: 2010-04-26
52.: 2010-04-27
53.: 2010-04-28
54.: 2010-04-29
55.: 2010-04-30
56.: 2010-05-01
57.: 2010-05-02
58.: 2010-05-03
59.: 2010-05-04
60.: 2010-05-05
61.: 2010-05-06
62.: 2010-05-07
63.: 2010-05-08
64.: 2010-05-09
65.: 2010-05-10
66.: 2010-05-11
67.: 2010-05-12
68.: 2010-05-13
69.: 2010-05-14
70.: 2010-05-15
71.: 2010-05-16
72.: 2010-05-17
73.: 2010-05-18
74.: 2010-05-19
75.: 2010-05-20
76.: 2010-05-21
77.: 2010-05-22
78.: 2010-05-23
79.: 2010-05-24
80.: 2010-05-25
81.: 2010-05-26
82.: 2010-05-27
83.: 2010-05-28
84.: 2010-05-29
85.: 2010-05-30
86.: 2010-05-31
87.: 2010-06-01
88.: 2010-06-02
89.: 2010-06-03
90.: 2010-06-04
91.: 2010-06-05
92.: 2010-06-06
93.: 2010-06-07
94.: 2010-06-08
95.: 2010-06-09
96.: 2010-06-10
97.: 2010-06-11
98.: 2010-06-12
99.: 2010-06-13
100.: 2010-06-14

Code erhellen

Sonntag, den 28. Februar 2010

Der Aal, cHmuul.net, erwendet zum Code-Hightlightning CodeColorer. Nettes Wordpress-Plugin. Das Plugin basiert auf Geshi, nicht zu verwechseln mit dem Python-Projekt Genshi

Und jetzte der Test:

1
2
# the zen of python
import this