Il est recommandé d'utiliser l'instruction with
lors de l'ouverture d'un fichier en Python. Cependant, ouvrir des fichiers de variables en même temps avec cette syntaxe n'est pas simple. Bien sûr, cela ne fonctionne pas même si je l'écris comme ça.
with [open(fn) for fn in file_names] as files:
Par exemple, lors de l'exécution d'un traitement tel que la commande coller, une ouverture simultanée est absolument nécessaire. Donc, dans cet article, je vais écrire sur la façon d'utiliser l'instruction with
pour obtenir un comportement comme la commande paste en Python.
fileopen
(Référence: [Comment lire du texte par entrée standard ou spécification de nom de fichier comme cat en Python](https://qiita.com/hi- asano / items / 010e7e3410ea4e1486cb)).avec open (a) comme f1, open (b) comme 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()
Le comportement lorsque type = argparse.FileType (), default = '-'
est spécifié dans ʻadd_argument () est [cet article](https://qiita.com/hi-asano/items/010e7e3410ea4e1486cb) Comme c'est le cas. Et cette fois, en combinant avec
nargs = '*'`, vous pouvez obtenir une liste d'objets fichier à partir d'un nombre variable d'arguments de ligne de commande.
Et ce que je veux le plus transmettre, c'est la partie de cette déclaration «avec». En premier lieu, l'instruction with est utilisée pour encapsuler l'exécution d'un bloc avec la méthode du "gestionnaire de contexte". Et le module pour implémenter facilement ce type de gestionnaire de contexte est contextlib.
Pour gérer un nombre variable de fichiers avec une instruction with
comme cette fois, créez d'abord un gestionnaire de contexte avec ʻExitStack ()et ajoutez l'objet que vous voulez gérer avec ʻenter_context ()
. Avec cela, fermer est appelé fermement lors de la sortie du bloc with.
S'écartant de l'objectif de cet article, voici un exemple d'implémentation de 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))
Question 13 sur 100 coups de langue est également OK avec ce code
Recommended Posts