Lesen von Text mit Standardeingabe oder Dateinamen wie cat in Python

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

0. Grundlegend

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.

1. Einfache Fallklassifizierung

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.

  1. argparse.Filetype()

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)

  1. argparse + fileinput Ich denke, dies ist ein seltener Fall, aber es gibt Zeiten, in denen Sie mehrere Dateinamen angeben und einzeln lesen möchten oder die Standardeingabe verwenden möchten, wenn keine angegeben sind. In einem solchen Fall ist es einfach, das Dateieingabemodul zusammen zu verwenden.

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 ...

Zusammenfassung

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)

Frage

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

Lesen von Text mit Standardeingabe oder Dateinamen wie cat in Python
Lesen von Standardeingabe- oder Variablendateien gleichzeitig wie der Befehl Einfügen in Python
[Python] Ändern Sie die Standardeingabe von der Tastatur in eine Textdatei
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
So importieren Sie Dateien in Python an eine beliebige Stelle
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen einer CSV-Datei mit Python 2/3
So erstellen Sie eine JSON-Datei in Python
[Python] Wie man Excel-Dateien mit Pandas liest
So geben Sie "Ketsumaimo" standardmäßig in Python aus
So lesen Sie Dateien in verschiedenen Verzeichnissen
Lesen aller in * .py enthaltenen Klassen in dem von Python angegebenen Verzeichnis
So erhalten Sie den Variablennamen selbst in Python
So messen Sie die Verarbeitungszeit mit Python oder Java
Lesen Sie die XML-Datei anhand des Python-Tutorials
[Arbeitseffizienz] So ändern Sie Dateinamen im Stapel mit Python
Lesen von CSVs, die in Python nur Ganzzahlen enthalten
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
Ändern Sie das Standardausgabeziel in eine Datei in Python
Sprechen mit Python [Text zu Sprache]
[Python] So ändern Sie die in xlsb gespeicherte EXCEL-Datei in xlsx
Wie man in Python entwickelt
[Python] Befehlszeilenargumente aus Dateiname oder Standard lesen
Lesen einer Excel-Datei (.xlsx) mit Pandas [Python]
[Python] Verwendung von input ()
Konvertieren Sie eine Excel-Datei für verschiedene Zwecke in Python in Text
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
So stellen Sie fest, dass in Python3 ein Kreuzschlüssel eingegeben wurde
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
[Django] Lesen von Variablen / Konstanten, die in einer externen Datei definiert sind
[Python] Wie man PCA mit Python macht
So sammeln Sie Bilder in Python
Verwendung von SQLite in Python
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Umgang mit Japanisch mit Python
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
[Python Kivy] So erhalten Sie den Dateipfad durch Ziehen und Ablegen
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
Speichern von CSV-Daten in Amazon Kinesis Streams mit Standardeingabe
[Python] Lesen der CSV-Datei (Methode read_csv des Pandas-Moduls)
Der Dateiname war in Python schlecht und ich war süchtig nach Import
So formatieren Sie eine Liste von Wörterbüchern (oder Instanzen) in Python
Lesen von Umgebungsvariablen aus einer ENV-Datei mit PyCharm (für Mac)
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
Was tun, wenn die Python-Version in Cloud 9 von einer anderen Person erstellt wurde?
[Python] So konvertieren Sie eine Datenbankdatei in CSV
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Wie man pydoc auf Python Interpreter liest
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
Python Hinweis: Modularisierung: __name__ == Verwendung von '__ main__'
So konvertieren Sie Python in eine exe-Datei
[Itertools.permutations] So löschen Sie eine Sequenz in Python
Konvertieren Sie die psd-Datei in Python in png
Python3-Standardeingabe habe ich versucht zusammenzufassen