Befehle wie "cat" werden mit dem Dateinamen als Argument gelesen. Wenn jedoch kein Dateiname angegeben wird, wird die Standardeingabe gelesen. Dieses Mal habe ich untersucht, wie dies mit Python erreicht werden kann.
$ cat input.txt
$ cat < input.txt
$ python hoge.py input.txt
$ python hoge.py < input.txt
In Python sind sowohl die Standardeingabe als auch der Zeiger auf die Textdatei Dateiobjekte (insbesondere Instanzen der Klasse "_io.TextIOWrapper"), sodass die folgenden Funktionen auch dann funktionieren, wenn die Standardeingabe "sys.stdin" als Argument angegeben wird. Ich werde.
def process(fp):
for line in fp:
print(line, end='')
Was macht dieser Artikel mit diesem externen Prozess? Dabei werden drei Methoden betrachtet.
hoge.py
import argparse
import sys
def main():
parser = argparse.ArgumentParser()
parser.add_argument('filename', nargs='?')
args = parser.parse_args()
if args.filename is None:
process(sys.stdin)
else:
with open(args.filename) as f:
process(f)
if __name__ == "__main__":
main()
Es ist eine einfache Möglichkeit, zu verzweigen, je nachdem, ob ein Befehlszeilenargument angegeben wird. In diesem Artikel berücksichtigen wir keine spezielle Ausnahmebehandlung für "OSError" beim Ausführen von "open ()" und "process ()", sondern schließen die Datei, selbst wenn eine Ausnahme in "process ()" auftritt. Ist ein Muss.
Wenn Sie hier argparse
hinzufügen und nargs = '?'
Weglassen, wird Dateiname
benötigt.
Diese Methode ist sehr leicht zu verstehen, aber was nicht überrascht, ist, dass "process ()" an zwei Stellen beschrieben wird. Wenn Sie sich etwas mehr ausdenken, können Sie es an einem Ort platzieren, aber wenn-sonst fühlt es sich immer noch etwas überflüssig an.
hoge.py
import argparse
import sys
def main():
parser = argparse.ArgumentParser()
parser.add_argument('infile', nargs='?', type=argparse.FileType(),
default=sys.stdin)
args = parser.parse_args()
with args.infile as f:
process(f)
Es ist ein wenig ungewohnt, aber insgesamt ist es sehr erfrischend.
Durch Setzen von "type = argparse.FileType ()" wird "open ()" im Moment von "parse_args ()" aufgerufen und der Rückgabewert gespeichert. Wenn der angegebene Dateiname zu diesem Zeitpunkt "-" lautet, wird er in die Standardeingabe / -ausgabe konvertiert. Wenn Sie also "default =" - "" setzen, wird die Beschreibung ein wenig reduziert und "import sys" wird nicht benötigt, aber für Fremde ist es schwer zu verstehen, und [Dokumentbeispiel](https: // docs. python.org/ja/3/library/argparse.html) gibt auch explizit default = sys.stdin
an.
Und es ist normal, "open ()" unmittelbar nach "with" zu schreiben, aber der Rückgabewert ist auch für das Dateiobjekt selbst der gleiche, sodass die Operation dieselbe ist. Obwohl die Bedeutung der Verwendung von "as" abnimmt.
sys.stdin
wird normalerweise nicht verwendet, um mit der with
-Anweisung verwendet zu werden oderclose ()
aufzurufen, aber es ist gut definiert, da es sich um einen TextIOWrapper handelt. Wahrscheinlich wird es in einem solchen Fall verwendet. (Quelle erforderlich)
hoge.py
import argparse
import fileinput
def main():
parser = argparse.ArgumentParser()
parser.add_argument('filenames', nargs='*')
args = parser.parse_args()
with fileinput.input(args.filenames) as f:
process(f)
fileinput.input ()
öffnet die aufgezählten Dateinamen nacheinander und konvertiert sie in Standardeingaben, wenn kein Dateiname angegeben ist.
Selbst wenn -
als Dateiname angegeben ist, wird die Standardeingabe aufgerufen. Wenn Sie also $ python hoge.py input.txt -
usw. ausführen, wird die Standardeingabe nach dem Lesen von input.txt gelesen. Nun, das wird keine große Sache!
Persönlich denke ich, dass die Schwierigkeit darin besteht, dass dieses Dateieingabemodul Standardeingaben zu unterstützen scheint, wenn Sie es nicht wissen. Es gibt keinen Ort. Ich denke nicht, dass dies ein so berühmtes Modul ist ...
Ich denke, es ist am besten, Methode 2 beim Lesen einer Datei ** oder ** Standardeingabe und Methode 3 beim Lesen mehrerer Dateien ** oder ** Standardeingabe zu verwenden.
(11/23 postscript) Klicken Sie hier, wenn Sie mehrere Dateien gleichzeitig lesen möchten → [So lesen Sie Standardeingabe- oder Variablendateien gleichzeitig wie den Einfügebefehl in Python](https://qiita.com/hi-asano/ items / de83b18ce4365dd6f793)
Wenn Sie versuchen, dasselbe in einer anderen Sprache zu tun, müssen Sie es normalerweise mit if-else wie 1 tun, was ziemlich schwierig ist? Perl scheint einfach zu sein.
Recommended Posts