Es wird empfohlen, beim Öffnen einer Datei in Python die Anweisung "with" zu verwenden. Das gleichzeitige Öffnen variabler Dateien mit dieser Syntax ist jedoch nicht einfach. Natürlich funktioniert es nicht, auch wenn ich es so schreibe.
with [open(fn) for fn in file_names] as files:
Wenn Sie beispielsweise eine Verarbeitung wie den Befehl Einfügen ausführen, ist ein gleichzeitiges Öffnen unbedingt erforderlich. In diesem Artikel werde ich daher beschreiben, wie Sie mit der Anweisung "with" ein Verhalten wie den Befehl "paste" in Python erzielen.
fileopen
(Referenz: [Lesen von Text anhand von Standardeingaben oder Dateinamen wie cat in Python](https://qiita.com/hi- asano / items / 010e7e3410ea4e1486cb)).mit open (a) als f1, open (b) als f2:
etc.paste.py
import argparse
import contextlib
def main():
parser = argparse.ArgumentParser()
parser.add_argument('fs', nargs='*', type=argparse.FileType(),
default='-')
parser.add_argument('--delimiter', default='\t')
args = parser.parse_args()
with contextlib.ExitStack() as stack:
for f in args.fs:
stack.enter_context(f)
paste(args.fs, args.delimiter)
if __name__ == "__main__":
main()
Das Verhalten, wenn "type = argparse.FileType (), default =" - "" in "add_argument ()" angegeben ist, ist dieser Artikel Wie es ist in. Und dieses Mal können Sie durch Kombinieren mit nargs = '*'
eine Liste von Dateiobjekten aus einer variablen Anzahl von Befehlszeilenargumenten abrufen.
Und was ich am meisten vermitteln möchte, ist der Teil dieser "with" -Aussage. Erstens wird die with-Anweisung verwendet, um die Ausführung eines Blocks mit der Methode "context manager" zu verpacken. Das Modul zur einfachen Implementierung dieses Kontextmanagertyps ist contextlib.
Um eine variable Anzahl von Dateien mit einer "with" -Anweisung wie dieser zu verarbeiten, erstellen Sie zuerst einen Kontextmanager mit "ExitStack ()" und fügen Sie das Objekt hinzu, das Sie mit "enter_context ()" verwalten möchten. Damit wird beim Verlassen des with-Blocks fest geschlossen aufgerufen.
Abweichend vom Zweck dieses Artikels finden Sie hier ein Beispiel für die Implementierung von "paste ()".
from itertools import zip_longest
def rstrip(x):
if x is None:
return ''
else:
return x.rstrip()
def paste(files, delimiter):
for lines in zip_longest(*files):
stripped = map(rstrip, lines)
print(delimiter.join(stripped))
Frage 13 von 100 Sprachverarbeitungsklopfen ist auch mit diesem Code in Ordnung
Recommended Posts