text-processing – ¿Cómo hago para que los programas de Python se comporten como herramientas de Unix adecuadas?

Pregunta:

Tengo algunos scripts de Python por ahí y estoy trabajando para reescribirlos. Tengo el mismo problema con todos ellos.

No me resulta obvio cómo escribir los programas para que se comporten como herramientas de Unix adecuadas.

Porque esto

$ cat characters | progname

y esto

$ progname characters

debería producir el mismo resultado.

Lo más parecido que pude encontrar a eso en Python fue la biblioteca de entrada de archivos. Desafortunadamente, realmente no veo cómo reescribir mis scripts de Python, todos los cuales se ven así:

#!/usr/bin/env python 
# coding=UTF-8

import sys, re

for file in sys.argv[1:]:
    f = open(file)
    fs = f.read()
    regexnl = re.compile('[^\s\w.,?!:;-]')
    rstuff = regexnl.sub('', fs)
    f.close()
    print rstuff

La biblioteca fileinput procesa stdin si hay un stdin y procesa un archivo si hay un archivo. Pero itera sobre líneas simples.

import fileinput
for line in fileinput.input():
    process(line)

Realmente no entiendo eso. Supongo que si está tratando con archivos pequeños, o si no está haciendo mucho con los archivos, esto puede parecer obvio. Pero, para mis propósitos, esto lo hace mucho más lento que simplemente abrir todo el archivo y leerlo en una cadena, como se indicó anteriormente.

Actualmente ejecuto el script de arriba como

$ pythonscript textfilename1 > textfilename2

Pero quiero poder ejecutarlo (y sus hermanos) en tuberías, como

$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2

Respuesta:

Compruebe si se proporciona un nombre de archivo como argumento, o lea de sys.stdin .

Algo como esto:

if sys.argv[1]:
   f = open(sys.argv[1])
else:
   f = sys.stdin 

Es similar a la respuesta de Mikel, excepto que usa el módulo sys . Supongo que si lo tienen ahí debe ser por una razón …

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım