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?Agregar línea en la parte superior de cada archivo Python en los directorios actuales y secundarios
Agregar línea en la parte superior de cada archivo Python en los directorios actuales y secundarios
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 .py
archivos en un directorio recursivamente ejecutar este comando en la shell:
find . -name '*.py' | xargs perl script.pl
for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
Al final probablemente quería 'rm $ a.cp' – eumiro
@eumiro: Gracias. Fijo. –
@Didier: ¿quiso decir 'encontrar. -name * .py'? –
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)
Por lo que yo sé no se puede insertar en el comienzo o al final del archivo en pitón. Solo vuelva a escribir o anexar.
+1 para hacerlo en python –
Esto
- caminar recursivamente todos los directorios a partir de la corriente de trabajo directorio
- modificar solo esos archivos s cuyo nombre termina con '.py'
- preservar los permisos de archivo (a diferencia de
open(filename,'w')
.)
fileinput también le da la opción de realizar copias de seguridad de los 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)
find . -name \*.py | xargs sed -i '1a Line of text here'
Editar: desde el comentario de tchrist, manejar nombres de fichero con espacios.
Suponiendo que ha GNU encontrar y xargs (como se ha especificado la etiqueta de Linux en la pregunta)
find . -name \*.py -print0 | xargs -0 sed -i '1a Line of text here'
Sin herramientas GNU, que haría algo como:
while IFS= read -r filename; do
{ echo "new line"; cat "$filename"; } > tmpfile && mv tmpfile "$filename"
done < <(find . -name \*.py -print)
Obtienes el premio por la forma más corta y más obvia de acercarte a esto. Usted tiene un error potencial con espacios en blanco en el directorio o nombres de archivos, pero eso es fácil de arreglar con '-print0' a la izquierda y' -0' a la derecha. – tchrist
@tchrist: ¿No se limitará a imprimir la respuesta a STDOUT en lugar de agregar la línea al principio de cada archivo? –
@David, no, la opción '-i' para sed significa actualizar el archivo en el lugar. No verá nada en stdout. –
Lo que es ¿La forma más fácil de hacerlo utilizando Perl, Python o script de shell?
Usaría Perl, pero eso es porque conozco a Perl mucho mejor de lo que conozco a Python. Diablos, tal vez haría esto en Python solo para aprenderlo un poco mejor.
La forma más fácil manera es utilizar el lenguaje que usted está familiarizado con y puede trabajar con ellos. Y, probablemente también sea la mejor manera.
Si se trata de todos los scripts de Python, supongo que conoces Python o tienes acceso a un grupo de personas que conocen Python. Entonces, probablemente estés mejor haciendo el proyecto en Python.
Sin embargo, es posible con scripts de shell también, y si conoce el shell lo mejor, sea mi invitado.Aquí hay un poco, shell script, no está comprobado derecha de 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 para usar la herramienta correcta, 'sed', pero tienes un error: deberías decir' -print0' para 'encontrar' y conectar a 'mientras IFS = read -d' \ 0 '-r file', para evitar problemas con nombres de archivos problemáticos. – Sorpigal
En realidad, los espacios o las pestañas en los nombres no son un gran problema aquí (aunque LF en el medio de los nombres de los archivos). Revisando mi programa, el gran problema es que no cité la variable '$ file'. Si hubiera un espacio en el nombre del archivo, mi programa no funcionaría. –
- 1. agregar un texto en la parte superior del archivo
- 2. ¿Cómo enumerar solo los directorios de nivel superior en Python?
- 3. Relleno la parte superior y la parte inferior del elemento en línea
- 4. Python csv.reader: ¿Cómo regreso a la parte superior del archivo?
- 5. ¿Cómo agregar una vista en la parte superior del teclado?
- 6. python: trazado de un histograma con una línea de función en la parte superior
- 7. ¿Cómo agregar 20 píxeles de blanco en la parte superior de un archivo de imagen existente?
- 8. Alineación flotante CSS en la parte superior
- 9. desove ya la espera de los procesos secundarios en Python
- 10. Cómo mostrar la frecuencia en la parte superior de cada factor en una barplot en I
- 11. ¿Debo usar/* */o/** */para los derechos de autor en la parte superior de un archivo java?
- 12. cómo poner la línea actual bajo edición en la parte superior de la pantalla en vim
- 13. Java setFullScreenWindow() mantener en la parte superior
- 14. agregar algo a la parte superior de un objeto JSON
- 15. % Columna de la CPU y carga en la parte superior
- 16. Enfrente de "siempre en la parte superior"
- 17. ¿Cómo saltar la parte superior del archivo en PhpStorm?
- 18. Mantener diálogos en la parte superior de la ventana, pero no en la parte superior de todo
- 19. Barra de herramientas UIPopoverController en la parte superior
- 20. LINQ Únete en la parte superior 1
- 21. Excel VBA - total de la línea fronteriza que añadir en la parte superior e inferior solamente
- 22. cómo insertar o agregar una nueva línea en la parte superior de la jtextarea en java swing?
- 23. cómo dar salida a cada línea en un archivo python
- 24. cómo derivar fecha y hora actuales y añadir al final de cada línea que contiene 'Hola'
- 25. highchart: añadir imágenes a la parte superior de la tabla en cada columna
- 26. dónde obtiene la parte superior los datos en tiempo real
- 27. UITextView margen extraño en la parte superior?
- 28. iPhone: Espacio extraño en la parte superior de UINavigationController
- 29. ¿Qué debo poner en los comentarios del encabezado en la parte superior de los archivos fuente?
- 30. Campos de formulario en línea con etiquetas colocadas en la parte superior
Prefiero 'perl -pi -e 'BEGIN {print" Una nueva línea "}' $ (buscar. -name '* .py')' :) – hobbs
@hobbs: I Entérate de la idea, pero parece que no funciona para mí (en 5.10) –