Montag, 22. Oktober 2012
Aufgabe newprog.py (POS1: 2BHIF)
Neue Programmdateien haben im Allgemeinen eine ziemlich fixe (Anfangs-)Struktur. So wird immer ein Programmkopf (Kommentar) benötigt, der den Namen des Autors und andere Informationen enthält. Für Python sieht das z.B. so aus:
""" author: Maier Maria matnr: d84123 file: newprog.py desc: Erstellen eines Programmgerüsts aus einer Vorlage. date: 2010-10-22 class: 5AHDVK catnr: 23 """
Schreiben Sie ein Pythonprogramm newprog.py
, welches aus einer Vorgabedatei so ein Programmgerüst erzeugt. In dieser Vorgabedatei gibt es Wörter, die dann von newprog.py
durch die entsprechenden Werte ersetzt werden. Obiges Gerüst ist aus folgender Vorgabedatei entstanden:
""" author: AUTOR matnr: EVIDENZNUMMER file: DATEINAME desc: ZWECK date: DATUM class: KLASSE catnr: KATALOGNUMMER """ if __name__ == '__main__': pass
Für die Ersetzungen soll ein Dictionary verwendet werden, z.B.:
ersetzungen = { "DATEINAME": progname, "ZWECK": zweck, "DATUM": datum, "AUTOR": "Maier Maria", "KATALOGNUMMER": "23", "EVIDENZNUMMER": "d84123", "KLASSE": "5AHDVK" }
progname
, zweck
, datum
müssen natürlich vorher bestimmt werden (eingegeben).
Zur Bestimmung des Datums verwenden Sie strftime()
:
from time import strftime datum = strftime("%F")
strftime()
kennt verschiedenste Formatangaben und liefert die aktuelle Uhrzeit bzw. Datum formatiert zurück. Hilfe mit help(strftime)
in Python bzw. man strftime
von der Shell (liefert die Beschreibung der C-Funktion, aber die Formatangaben gelten auch für Python).
Die Vorgabedatei und der Name der zu erzeugenden Datei sind auf der Kommandozeile anzugeben, z.B.:
~/work/tmp > python newprog.py vorgabe.py meinNeuesProgramm.py ~/work/tmp >
Wird keine Vorgabedatei angegeben, so wird eine Standardvorgabedatei verwendet:
~/work/tmp > python newprog.py meinNeuesProgramm.py ~/work/tmp >
Falls meinNeuesProgramm.py
schon existiert, dann darf diese Datei nicht überschrieben werden:
~/work/tmp > python newprog.py meinNeuesProgramm.py 'meinNeuesProgramm.py' already exists! ~/work/tmp >
Sie können dazu folgende Funktion verwenden (Aufrufbeispiel im Home-Verzeichnis):
>>> from os.path import exists >>> exists(".bashrc") True >>> exists(".bashrc__") False >>>
Labels: Aufgabe, POS1-2, Python
Donnerstag, 18. Oktober 2012
Aufgabe Unit-Tests (POS1: 3BHIF)
In einem Online-Shop wird unter anderem ein Warenkorb benötigt. Schreiben Sie Unit-Tests zu folgendem Interface (welches Sie natürlich auch implementieren müssen):
import java.util.Iterator; /** * @author (c) 2012, Harald R. Haberstroh 18.10.2012 */ public interface ShoppingCart { /** * legt die übergebene Anzahl von Elementen in den Warenkorb * * @param anItem * Element * @param quantity * Anzahl * @throws NegativeCountException * negative Anzahl gibt's nicht */ public void addItems(Item anItem, int quantity) throws NegativeCountException; /** * entfernt die Anzahl von Elementen vom Warenkorb. * * @param anItem * welches Element * @param quantity * Anzahl * @throws NegativeCountException * negative Anzahl gibt's nicht * @throws NoSuchItemException * das Element existiert nicht im Warenkorb */ public void deleteItems(Item anItem, int quantity) throws NegativeCountException, NoSuchItemException; /** * wieviele Element gibt's überhaupt * * @return Anzahl Elemente */ public int itemCount(); /** * Iterator für alle Elemente (siehe Collection-API). * * @return Iterator über alle Elemente */ public Iterator<Item> iterator(); }Denken Sie bei der Erstellung der Tests an Grenzfälle, Sonderfälle und erst dann an den "Normalfall".
Montag, 15. Oktober 2012
Python: Lesen von Datei oder Standardeingabe
from sys import stdin from sys import argv if len(argv) > 1: file = open(argv[1]) else: file = stdin lines = file.readlines() print("gelesen:") print(lines)Das Beispiel-Script liest alle Zeilen der Eingabe mit
file.readlines()
in eine Liste. Dabei ist es unerheblich, ob die Eingabe von einer Datei kommt, die auf der Kommandozeile angegeben wurde, oder von der Standardeingabe kommt (kein Dateiname).
sys.stdin
verhält sich wie eine Datei, die nur zum Lesen geöffnet wurde, jedoch nur einmal gelesen werden kann (kein sys.stdin.seek(0)
möglich).
Variable
file
verweist also entweder auf die geöffnete Datei oder eben die Standardeingabe. Der Algorithmus zur Bearbeitung der Daten (hier nur Lesen in eine Liste und Ausgeben der Liste) ist identisch.
Beispielaufruf ohne Parameter:
hp@if211l $ python3 stdin.py Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet gelesen: ['Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie \n', 'consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan\n', 'et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis \n', 'dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet\n'] hp@if211l $
hp@if211l $ python3 stdin.py stdin.py gelesen: ['from sys import stdin\n', 'from sys import argv\n', 'if len(argv) > 1:\n', ' file = open(argv[1])\n', 'else:\n', ' file = stdin\n', 'lines = file.readlines()\n', 'print("gelesen:")\n', 'print(lines)\n'] hp@if211l $
Sonntag, 7. Oktober 2012
Aufgabe Python Kommandozeile, Textdateien lesen (POS1: 2BHIF)
Schreiben Sie folgendes Pythonprogramm:
cut.py
, welches einen bestimmten Zeilenbereich der Eingabe (Text) ausgibt (und den Rest unterdrückt). Die Eingabe kann aus beliebig vielen Dateien, die als Kommandozeilenparameter angegeben werden, oder aus der Standardeingabe (Tastatur oder Eingabe umlenkung mit <) bestehen.
Für jede Datei soll dann der als Optionen angegebene Zeilenbereich ausgegeben werden.
Aufruf
cut.py [-f N] [-t N] [-h] [file]...Falls keine Optionen angegeben werden, dann sollen die ersten 10 Zeilen jeder Datei (oder Standardeingabe) ausgegeben werden.
Optionen
- -f N
- Der Zeilenbereich beginnt ab Zeile N. Entfällt diese Option, dann beginnt die Ausgabe bei der ersten Zeile.
- -t N
- Der Zeilenbereich endet bei Zeile N (inklusive). Entfällt diese Option, dann endet die Ausgabe bei der Zeile 10.
- -h
- Es soll eine kurze Hilfe mit ihrem Namen ausgegeben werden. Zum Beispiel:
cut.py [-f N] [-t N] [file]... -f N ... from line N (default 1) -t N ... to line N (default 10) Print given lines of each file. (c) 2012, Harald R. Haberstroh
Es soll keine weitere Ausgabe erfolgen!
Beispiel
Gegeben sei die Datei1.txt
mit dem Inhalt (Zeilennummern nur zur Orientierung, nicht Inhalt der Datei):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, |
hh@knuth:~$ cut.py -h cut.py [-f N] [-t N] [file]... -f N ... from line N (default 1) -t N ... to line N (default 10) Print given lines of each file. (c) 2012, Harald R. Haberstroh hh@knuth:~$ cut.py 1.txt Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo hh@knuth:~$ cut.py -f 3 -t 12 1.txt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. hh@knuth:~$ cut.py -t 3 1.txt Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
Beispiele für fehlerhafte Angaben
Eine ungültige Option wird angegeben:hh@knuth:~$ cut.py -x 23 1.txt
-t
:
hh@knuth:~$ cut.py -f 23 -t 1.txt
hh@knuth:~$ cut.py -f 23 -t 12 1.txt
hh@knuth:~$ cut.py doesntexist.txt
Labels: Aufgabe, POS1-2, Python
Abonnieren Posts [Atom]