Montag, 15. Oktober 2012
Python: Lesen von Datei oder Standardeingabe
Üblicherweise arbeiten Unix-Kommandos sowohl mit der Standardeingabe (Tastatur oder Eingabeumlenkung) als auch mit Dateien. Damit der Algorithmus für die Bearbeitung der gelesenen Eingabe nicht doppelt programmiert werden muss, kann man sich folgenden Tricks bedienen:
Variable
Beispielaufruf ohne Parameter:
Beispielaufruf mit Parameter:
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 $
Abonnieren Posts [Atom]
Kommentar veröffentlichen