Usare lo Unix Piping con Python

A volte si ha bisogno di una funzione particolare che non è immediatamente ottenibile combinando i comandi usati più spesso nelle Pipe (more, grep, wc e così via).
Invece di cercare soluzioni, a volte complicate, in Internet possiamo scrivere rapidamente noi il programma!

Python prevede due file speciali per leggere dati dallo standard-input e scrivere i risultati nello standard-output e realizzare così in brevissimo tempo il comando che ci serve.

Entrambi i file sono definiti nel modulo sys e questo è ad esempio un programma che stampa sullo standard-output la riga più lunga di un file di testo il cui nome viene letto dallo standard-input:

#!/usr/bin/env python3

import sys

for file_name in sys.stdin:
    max_line = ''
    with open(file_name.strip(), 'r') as f:
        for l in f:
            l = l.rstrip()
            if len(l) >= len(max_line):
                max_line = l

    sys.stdout.write(f'{max_line}\n')

copiamo questo codice in un file, ad esempio longest_line.py e rendiamolo eseguibile, ad esempio con il comando

$ chmod a+x longest_line.py

A questo punto possiamo usare il nostro programma come tutti gli altri comandi Unix che possono essere collegati tra di loro tramite Pipe.
Ad esempio possiamo scrivere:

$ ls *.txt | ./longest_line.py

per visualizzare la riga più lunga di ciascun file che si trova nella cartella corrente e il cui nome ha estensione .txt.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *