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:
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 $ 
Beispielaufruf mit Parameter:
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 $

Labels: ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]