Comment lire des entrées standard ou des fichiers variables en même temps comme la commande coller en Python

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.

Utilisez le module contextlib!

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.

mise en œuvre de la pâte

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

De côté

Question 13 sur 100 coups de langue est également OK avec ce code

Recommended Posts

Comment lire des entrées standard ou des fichiers variables en même temps comme la commande coller en Python
[Python] Comment ouvrir deux fichiers ou plus en même temps
Comment lire du texte avec une entrée standard ou une spécification de nom de fichier comme cat en Python
Comment obtenir les fichiers dans le dossier [Python]
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment obtenir le nom de la variable lui-même en python
Comment mesurer le temps de traitement avec Python ou Java
Comment déboguer une bibliothèque Python standard dans Visual Studio
Dans la commande python, python pointe vers python3.8
[sh] Comment stocker les résultats de l'exécution de la commande dans des variables
Comment vérifier la taille de la mémoire d'une variable en Python
Comment déterminer qu'une clé croisée a été entrée dans Python3
Comment afficher les octets de la même manière en Java et Python
Comment lire des fichiers CSV avec Pandas
[Python] Ajouter un commentaire au fichier d'entrée standard
Comment masquer l'invite de commande lors de l'exécution de python dans Visual Studio 2015
Comment obtenir la différence de date et d'heure en secondes avec Python
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment utiliser la bibliothèque C en Python
Comment générer un code QR et un code à barres en Python et le lire normalement ou en temps réel avec OpenCV
Comment recevoir des arguments de ligne de commande en Python
Comment incorporer des variables dans des chaînes python
Résumé de la façon d'importer des fichiers dans Python 3
Comment lire toutes les classes contenues dans * .py dans le répertoire spécifié par Python
Comment lire les données de séries chronologiques dans PyTorch
Transformez plusieurs listes avec l'instruction for en même temps en Python
Comment générer "Ketsumaimo" en standard en Python
Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Comment récupérer la nième plus grande valeur en Python
[Pour les débutants] Comment utiliser la commande say avec python!
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Comment ajouter des numéros de page à un fichier PDF (en Python)
Comment utiliser le modèle appris dans Lobe en Python
[Python] Comment afficher les valeurs de liste dans l'ordre
Procédure pour changer le nom de la table et le nom de la colonne du modèle Django en même temps
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Ce qui semble être un modèle pour la partie d'entrée standard du pro de la concurrence en python3
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
Comment changer le fichier de configuration pour qu'il soit lu par Python
[Go language] Comment obtenir l'entrée du terminal en temps réel
Comment exécuter un fichier Python à une invite de commande Windows 10
Comment utiliser la méthode __call__ dans la classe Python
Changer la destination de sortie standard en un fichier en Python
Comment importer des fichiers où vous le souhaitez en Python
Comment se connecter automatiquement comme 1Password depuis CLI
Autoriser Python à sélectionner la chaîne de caractères du fichier d'entrée dans le dossier
Comment copier et coller le contenu de la ligne de commande avec bash sous Linux ou Mac sans souris
Mettre le processus en veille pendant un certain temps (secondes) ou plus en Python
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Comment développer en Python
[Python] Comment utiliser input ()
Déterminez le format de la date et de l'heure avec Python et convertissez-le en Unixtime
Comment déterminer l'existence d'un élément sélénium en Python
Comment connaître la structure interne d'un objet en Python
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python