Estoy en una plataforma Ubuntu y tengo un directorio que contiene muchos archivos .py y subdirectorios (que también contienen archivos .py). Me gustaría agregar una línea de texto en la parte superior de cada archivo .py. ¿Cuál es la forma más fácil de hacerlo usando Perl, Python o script de shell?

7
MartinC 12 ago. 2011 a las 16:04

6 respuestas

La mejor respuesta
    #!/usr/bin/perl

    use Tie::File;
    for (@ARGV) {
        tie my @array, 'Tie::File', $_ or die $!; 
        unshift @array, "A new line";        
    }

Para procesar todos los archivos .py en un directorio ejecute recursivamente este comando en su shell:

find . -name '*.py' | xargs perl script.pl

4
Eugene Yarmash 12 ago. 2011 a las 12:51

¿Cuál es la forma más fácil de hacerlo usando Perl, Python o script de shell?

Usaría Perl, pero eso es porque conozco a Perl mucho mejor que Python. Diablos, tal vez haría esto en Python solo para aprenderlo un poco mejor.

La forma más fácil es usar el lenguaje con el que está familiarizado y con el que puede trabajar. Y esa también es probablemente la mejor manera.

Si todos estos son scripts de Python, supongo que conoce Python o tiene acceso a un grupo de personas que conocen Python. Entonces, probablemente sea mejor hacer el proyecto en Python.

Sin embargo, también es posible con shell scripts , y si conoces el mejor shell, sé mi invitado. Aquí hay un pequeño script de shell completamente no probado en la parte superior de mi cabeza:

find . -type f -name "*.py" | while read file
do
    sed 'i\
I want to insert this line
' $file > $file.temp
  mv $file.temp $file
done
1
David W. 12 ago. 2011 a las 15:09
find . -name \*.py | xargs sed -i '1a Line of text here'

Editar: desde el comentario de tchrist, maneje nombres de archivos con espacios.

Suponiendo que tiene GNU find y xargs (como especificó la etiqueta de Linux en la pregunta)

find . -name \*.py -print0 | xargs -0 sed -i '1a Line of text here'

Sin las herramientas de GNU, harías algo como:

while IFS= read -r filename; do
  { echo "new line"; cat "$filename"; } > tmpfile && mv tmpfile "$filename"
done < <(find . -name \*.py -print)
6
glenn jackman 12 ago. 2011 a las 16:06

Esta voluntad

  1. recorre recursivamente todos los directorios comenzando por el directorio de trabajo actual
  2. modifique solo aquellos archivos cuyo nombre de archivo termine con '.py'
  3. preservar los permisos de archivo (a diferencia de open(filename,'w').)

fileinput también le ofrece la opción de hacer una copia de seguridad de sus archivos originales antes de modificarlos .


import fileinput
import os
import sys

for root, dirs, files in os.walk('.'):
    for line in fileinput.input(
            (os.path.join(root,name) for name in files if name.endswith('.py')),
            inplace=True,
            # backup='.bak' # uncomment this if you want backups
            ):
        if fileinput.isfirstline():
            sys.stdout.write('Add line\n{l}'.format(l=line))
        else:
            sys.stdout.write(line)
4
unutbu 12 ago. 2011 a las 12:51
for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
5
Didier Trosset 12 ago. 2011 a las 13:07
import os
for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.py')
            file_ptr = open(file, 'r')
            old_content = file_ptr.read()
            file_ptr = open(file, 'w')
            file_ptr.write(your_new_line)
            file_ptr.write(old_content)

Hasta donde sé, no puede insertar al principio o al final del archivo en Python. Solo reescribe o agrega.

4
kdeveloper 4 jul. 2013 a las 17:45