Cómo modificar todos los archivos de texto en la carpeta con Python Script

A estrenar en Python, póster por primera vez, ¡sé fácil, por favor! Me gustaría insertar una línea de texto en todos los archivos de una extensión específica (en el ejemplo, .mod ) dentro de la carpeta actual. Puede apuntar a una carpeta específica si eso es más fácil.

A continuación hay algo que copié y modifiqué, que está haciendo exactamente lo que necesito para un archivo específico, la parte sobre la sustitución de sit con SIT es completamente innecesaria, pero si lo elimino, el progtwig no funciona. No tengo idea de por qué es eso, pero puedo vivir con eso.

 import sys, fileinput for i, line in enumerate(fileinput.input('filename.mod', inplace=1)): sys.stdout.write(line.replace('sit', 'SIT')) if i == 30: sys.stdout.write('TextToInsertIntoLine32' '\n') #adds new line and text to line 32 

Mi pregunta es, ¿cómo ejecuto esto para todos los archivos en un directorio? He intentado reemplazar el nombre del archivo con sys.argv[1] y llamar al script desde la línea de comandos con '*.mod' que no funcionó para mí. Cualquier ayuda sería apreciada.

Podría usar glob.glob para enumerar todos los archivos en el directorio de trabajo actual cuyo nombre de archivo termina con .mod :

 import fileinput import glob import sys for line in fileinput.input(glob.glob('*.mod'), inplace=True): sys.stdout.write(line.replace('sit', 'SIT')) if fileinput.filelineno() == 32: #adds new line and text to line 32 sys.stdout.write('TextToInsertIntoLine32' '\n') 

Puedes hacer así:

 import os folder = '...' # your directory files = [f for f in os.listdir(folder) if f.endswith('.mod')] 

Luego, puede obtener una lista de archivos con la extensión ‘.mod’, puede ejecutar su función para todos los archivos.

Fácil: no tienes que especificar un nombre de archivo. fileinput tomará los archivos de sys.argv de sys.argv de forma predeterminada. Ni siquiera tiene que usar enumerate , ya que la entrada de fileinput numera las líneas en cada archivo:

 import sys, fileinput for line in fileinput.input(inplace=True): sys.stdout.write(line.replace('sit', 'SIT')) if fileinput.filelineno() == 30: sys.stdout.write('TextToInsertIntoLine32' '\n') 

Puedes usar la función os.walk :

 for root, dirs, files in os.walk("/mydir"): for file in files: if file.endswith(".mod"): filepath = os.path.join(root, file) with open(filepath, 'r', encoding='utf-8') as f: text = f.read() print('%s read' % filepath) with open(filepath, 'w', encoding='utf-8') as f: f.write(text.replace('sit', 'SIT')) print('%s updated' % filepath)