martes, 30 de septiembre de 2025

Demanda. Propuesta.



Demanda de evaluación (II)





Solicitud del profesorado.


La primera fase de este proyecto es facilitar (al profesorado) un soporte para ayudarle en el análisis y la toma de decisión respecto a la demanda de evaluación.


En este proceso se diferencian dos fases: la identificaciones de dificultades (severas) de aprendizaje y de ajuste a las dinámicas del medio escolar que pueda presentar el alumno y, como segunda fase, la constatación de la aplicación (y el evidente fracaso) de medidas ordinarias de adaptación y apoyo.

Mientras que la primera fase implica, como condición necesaria, coherencia entre las calificaciones escolares y la identificación de dificultades, la segunda presupone la adopción previa de esas medidas ordinarias antes de la solicitud de una medida extraordinaria (1).

Dado que el objetivo del procedimiento es la detección de dificultades de las que puede derivar la identificación posterior de NEAE (2), interesa explicitar los motivos por los que se decide aquí seguir una determinada orientación entre otras posibles. También interesa justificar el procedimiento elegido para concretar dichas dificultades.

Sin pretensión de exhaustividad explico cual es la decisión y cómo se concreta. Opto por centrar el análisis en lo que denomino aprendizajes fundamentales por tramos de escolarización (3). Esta opción se opone tanto al desfase curricular como referencia, como a tomar en consideración el nivel competencial. Es además un planteamiento dinámico que se opone a una conceptualización estática de referencia única en cuanto a identificar dificultades de aprendizaje.

Mi opción se concreta como sigue: a lo largo de la escolarización obligatoria (4) podemos identificar, en términos de núcleos de aprendizajes fundamentales, al menos tres periodos, caracterizados por la centralidad de determinados aprendizajes, inicialmente ligados al proceso de maduración o desarrollo en los diferentes ámbitos en que éste se concreta, y en los que posteriormente predominan determinados contenidos conceptuales y procedimientales, pasando por una fase (la segunda) en la que dichos aprendizajes nucleares se identifican con lo que tradicionalmente se ha considerado nuclear en la escolarización: la adquisición de los llamados aprendizajes básicos o alfabetizadores (alfabetización letrada y alfabetización numérica).

La concreción de lo anterior tiene un doble interés: por un lado establece etapas diferenciadas de duración también diferente, y por otra plantea una diversidad de referentes para la valoración de las dificultades de aprendizaje. En el primer sentido interesa identificar el inicio y final de cada subperiodo. En el segundo diferenciar conceptualmente entre lo que se pueden considerar dificultades “menores” de lo que cabe entender como dificultades “severas”. Sólo las severas son consideradas relevantes para indicar pertinencia de intervenciones extraordinarias (empezando por la propia evaluación psicopedagógica) frente a las “menores”, que no lo son de lo anterior, sin dejar por ello de serlo de intervenciones “ordinarias” de ajuste curricular y medidas (también ordinarias) de apoyo, incluyendo el planteamiento de programas preventivos y/o programas específicos de refuerzo. Además, lo que en una fase previa es “menor” se considera “severo” en una fase posterior.

Concretando lo anterior establezco tres subperiodos, advirtiendo que incluso éstos (número y límites) están sujetos a debate y modificación, con indicación de lo que considero nuclear en cada uno como referencia para la identificación de dificultades severas y, justificante, por tanto, de derivación a medida extraordinaria de evaluación del SEO:
  • Primer subperiodo. Etapa de E. Infantil y hasta fin del segundo trimestre de P1. En este primer subperiodo se consideran referencias para la identificación de DA sugerentes de necesidad de derivación para evaluación psicopedagógica (en adelante DA-Der) los siguientes aprendizajes (expresados como DA-severas)
    • Dificultades (severas) en el desarrollo del lenguaje oral (comprensión y expresión)
    • Dificultades en la adquisición de los conceptos espacio-temporales básicos.
    • Dificultades en la adquisición de conceptos básicos cuantitativos.
    • Dificultades en el desarrollo de habilidades segméntales a nivel léxico y silábico.
    • Incapacidad para o alteración severa de la interacción con iguales que deriva en aislamiento social y dependencia excesiva del adulto.
    • Muy baja autonomía en el desarrollo de las actividades de aula  con incapacidad o severa limitación para la ejecución de actividades y rutinas.
  • Segundo subperiodo. Curso P1 (tercer trimestre) hasta finalizar P3. Durante esta fase se consideran aprendizajes nucleares (en términos de identificación de DA-Der) los considerados instrumentales básicos (dificultades severas) (5):
    • Dificultades en la comprensión del lenguaje oral
    • Dificultades en la expresión oral
    • Dificultades de decodificación lectora y de comprensión lectora básica (información explicitada en el texto)
    • Dificultades de escritura: ortografía natural y reglada básica y de composición de textos descriptivos y narrativos elementales.
    • Dificultades de numeración: lectura y escritura de números y comprensión del valor de posición.
    • Dificultades para el cálculo básico: sumas y restas sin y con llevadas.
    • Dificultades en la resolución y formulación de problemas matemáticos básicos: operaciones simples de suma, resta, producto y reparto (no incluye necesariamente el uso de operaciones de multiplicar y dividir).
  • Tercer subperiodo. A partir de P4 (incluido). Además de la persistencia de las dificultades previas (6), e incluso en su ausencia, se consideran ahora como DA-Der todas las que se manifiestan en el proceso de aprendizaje en las áreas del currículo. Esto es:
    • Dificultades severas en la lecto-escritura
    • Dificultades severas en la resolución de problemas y en la problematización de situaciones de la vida real.
    • Dificultades de aprendizaje en las áreas lingüísticas consideradas en su conjunto o individualmente en cada una de ellas (principalmente LCL y PLE-Inglés) si se considera que esas dificultades se observarán posteriormente en las demás.
    • Dificultades en la comprensión de los conceptos del área de Matemáticas y de Conocimiento del Medio (CCSS y/o CCNN).
    • Dificultades en la comprensión de la causalidad.
    • Dificultades para el análisis y la síntesis.
    • Dificultades observadas en los desplazamientos, la coordinación y la ejecución motora.
    • Dificultades en la comprensión del lenguaje musical básico y/o la ejecución rítmica.
    • Dificultades severas de motricidad fina con alteración significativa en la representación gráfica (dibujo).
Al contrario que en las anteriores, en el ámbito relacionado con el ajuste al ambiente escolar, que también se toma en consideración para identificar motivos de derivación, sólo lo será excepcionalmente en ausencia de las motivaciones DA-Der que corresponda por periodo de escolarización, cuando presenten un grado extremo de alteración/dificultades que se pueda asociar a trastorno o discapacidad diagnosticada o que, en su defecto, pueda sugerir su presencia (7) de modo que resulte pertinente que pudiera requerir, en su caso, derivación al ámbito sanitario.

Además, en este ámbito, únicamente se diferencian dos subperiodos: el primero coincidente con el primer periodo de las DA-Der y el segundo a partir del segundo subperiodo DA-Der (8):
  • En el primero, y de acuerdo con lo planteado en el ámbito de las DA-Der, nos centraremos en la autonomía personal y escolar y en la socialización (9).
  • En el segundo tendremos en cuenta lo anterior y todo lo que limita severamente el normal desarrollo del proceso de aprendizaje, incluyendo su doble dimensión personal y social-interaccional.

NOTAS

(1) No considero que sea aquí ni en este contexto donde se deba plantear el debate de la pertinencia de ambos criterios, que podemos considerar de exclusión. Por ello en este soporte únicamente se informa de ambos de forma genérica y previa, por medio de un texto informativo. Otro planteamiento podría haber sido establecerlo como parte del algoritmo, condicionando el seguimiento del proceso al cumplimiento de ambas condiciones.
(2) Proceso que corresponde como resultado a la evaluación psicopedagógica y no a un procedimiento previo como el actual.
(3) Aunque el desfase curricular resulta sencillo e interesante por su propia sencillez, en realidad es muy complejo de concretar, y está demasiado ligado a los resultados académicos, lo cual no sirve como referencia para identificar dificultades de aprendizaje. Aunque debería servir, pero no es el caso. El nivel de adquisición de las competencias básicas se enuncia tan fácilmente como difícil resulta concretarlo, y más en términos que resulten útiles para el objetivo de un proceso de derivación como el que se pretende realizar aquí.
(4) Del cual a nosotros nos interesa sólo una parte: desde la escolarización en EI hasta la finalización de EP.
(5) Aunque muy posiblemente también se puedan observar dificultades (incluso) severas y específicas en otras áreas del currículo de la etapa de E. primaria, en este subperiodo se entienden derivadas de las nucleares en los aprendizajes básicos antes identificados, por lo que no se consideran como  referentes para DA-Der en ausencia de esas dificultades nucleares; sí de medidas ordinarias de estimulación y refuerzo. Será necesario que el alumno se encuentre en el tercer subperiodo para que estas DA pasen a ser DA-Der. Este criterio también está sujeto a revisión y modificación, así como a aceptación de tratamiento excepcional en determinados casos.
(6) Que en buena lógica deberían haber sido detectadas como DA-Der en el periodo anterior.
(7) De modo que, en su momento, pudiera resultar pertinente derivación al ámbito sanitario. 
(8) A continuación se exponen los contenidos genéricos de ambos. Queda su concreción al desarrollo del soporte de automatización.
(9) Ambas ya están incluidas en el listado de DA-Der del primer subperiodo, por lo que no se requiere un listado específico.

Demanda. Propuesta.


Demanda de evaluación (I)





Planteamiento del modelo


Sin entrar ahora en lo que aporta el conocimiento de diferentes opciones autonómicas, y con independencia de la opinión que me merece el modelo asturiano (1), tras intentar formulaciones basadas en su planteamiento que resultaran útiles y viables, debo reconocer que no encontré una forma que me satisficiera, por lo que decidí crear un soporte que pudiera considerar ajustado a mis propios criterios. Evidentemente esto implica que como tal soporte no será de utilidad inmediata para tí como usuario, aunque espero que sí lo sea como persona interesada en desarrollar procedimientos automatizados de trabajo con los documentos.


En cuanto al objetivo, tras admitir posibles formulaciones amplias, esto es, que sirvieran no sólo para solicitud de intervención del SEO para evaluación psicopedagógica por alta NEAE, he llegado a la conclusión que un procedimiento como el que contemplan las diferentes formulaciones de las Administraciones educativas (y en esto son prácticamente coincidentes) carece de sentido si no es con esa única y exclusiva finalidad. Sólo ella justifica la complejidad de la formulación procedimental y volumen de información que se solicita del profesorado. Esto ni implica restricción de la demanda de intervención del SEO, antes al contrario, lo que planteo es que otras demandas de intervención no deben exigir ese grado de complejidad en la información que se solicita. Además, en la mayoría de las casuísticas la intervención del SEO forma parte del propio diseño de intervención, estando definida, con frecuencia, como prescriptiva o cuanto menos como pertinente por la propia normativa. Carece, pues, de sentido que lo que es parte de la intervención deba ser demandado como procedimiento extraordinario.

En cuanto al contenido he de decir que, aunque no me atengo a ninguno de los [modelos autonómicos analizados], me he fijado en el de Cantabria para la identificación de las dificultades y en el de Asturias para la exposición de las MAD implementadas. Sobre ambos he realizado las modificaciones que he considerado necesarias.

Estas modificaciones se concretan como identificación de las dificultades de aprendizaje en función del proceso de escolarización y lo que considero determinante (en cada fase del proceso) en términos de aprendizajes básicos fundamentales. 

En segundo lugar, tomo como referencia la presencia de alteraciones (significativas) en las manifestaciones más significativas del ajuste del alumno al ambiente escolar en cuanto a maduración socio-emocional y ajuste a las dinámicas que derivan del propio proceso de aprendizaje. 

Mayores cambios he realizado sobre las MAD, aunque he mantenido la diferenciación entre adaptaciones y apoyos. Parto de que existe coherencia entre la demanda de evaluación, en función de la detección de dificultades de aprendizaje y de adaptación, y los resultados académicos del alumno, aunque únicamente como información de las implicaciones de esa coherencia al profesorado. 

Básicamente los cambios que he realizado sobre la propuesta asturiana han sido eliminar del listado aquellas medidas que tiene carácter prescriptivo y derivan del cumplimento de condiciones reguladas por norma, como es el caso del PEMAR, o de los programas de refuerzo en función de decisiones de promoción. Todas ellas se imponen como obligatorias al profesorado, por lo que no se pueden considerar relevantes para el cumplimiento del criterio de pertinencia de la demanda de evaluación.

Por lo que se refiere a la base informática, aunque al principio había considerado adecuado plantearlo como DocAp, al optar por un planteamiento no directamente utilitario, me ha parecido que también podía aplicar este mismo criterio al procedimiento de trabajo. Soy consciente que esto hace aun menos “útil” mi propuesta, pero me libera de realizar un trabajo que en este proyecto simplemente resulta innecesario.

Mi alternativa se basa en el uso de script de Python, tanto para quienes cumplimentan el documento (el profesorado) como para sus destinatarios (los profesionales del SEO). Estos script deben ser entendidos como herramientas que ayudan a ambos (profesores y OE) a automatizar el trabajo, lo que implica que se deberán elaborar al menos dos script: uno para cumplimentar el documento (y para crearlo) y otro para trabajar con la información resultante del primer proceso.

Dentro de la primera fase del proyecto se pueden diferenciar dos partes: la cumplimentación de datos y la construcción del documento que se deberá entregar para archivo en el expediente del alumno y al SEO (2).

La segunda se reduce al acceso al contenido para posterior tratamiento por parte del SEO, estando pendiente de decidir qué grado de desarrollo se puede dar a este subproceso, dado que en realidad no concluye aquí, sino en la elaboración del informe psicopedagógico (3).

En estos momentos, mi idea es tratar cada una de estas partes en una entrada diferente. Es posible que sean necesarias más, especialmente para la primera parte.

NOTAS

(1) Algo dije ya [en esta entrada] (y en la que la precede en la sección Análisis), pero no descarto dedicar una ultima entrada de este análisis a comentar esta propuesta de forma específica.
(2) También cabe la posibilidad de que este en principio documento único se convierta en dos ligeramente diferenciados en función del destinatario final. Esta es una cuestión aun no decidida.
(3) Algo que obviamente no me planteo tratar en esta sección del blog, dado que [hay otra] donde se plantea.

Textos. Python.


Acceso a archivos





Para completar el tema del manejo de archivos txt mediante Python, nos queda hablar de la lectura o acceso al contenido, cuestión ésta de gran interés para la creación de script potentes en cuando a su funcionalidad.


Hasta el momento hemos visto la [creación y apertura de un archivo] y [cómo escribir en él], pero desconocemos cómo podemos acceder a su contenido, siendo como es fundamental para el desarrollo de un script de cierta complejidad.

Explico a continuación las fases por las que pasa la lectura de un archivo, entendiendo lectura como sinónimo de acceso al contenido:
  • Primero: acceso al archivo, paso previo, común también al proceso de escritura.
  • Segundo: lectura del contenido. Dentro de esta segunda fase deberemos distinguir dos condiciones alternativas: si deseamos acceder al texto como un bloque o si nos interesa hacerlo línea por línea. Esta opción está determinada, fundamentalmente, por el modo en que se ha escrito el contenido en el archivo.
Veamos ahora cómo concretamos en código cada fase y cada opción, ya que todas ellas permiten diferente formulaciones, empezando por el acceso (y apertura) del archivo, acción que permite dos formulaciones: la básica…

Archivo = ‘texto.txt’ 
contenido = open(archivo,’r’, encoding=‘utf-8’)

Cuerpo de instrucciones

contenido.close()

… en donde cambiamos el segundo parámetro por ‘r’ (reader) para especificar la acción que vamos a aplicar sobre el archivo, y la simplificada, que nos ahora la función de cierre

with open(archivo,’r’, encoding=‘utf-8’) as contenido:  

La segunda parte del proceso se basa en la lectura del contenido que se realiza, en principio con la función o método read()

texto_leer = contenido.read()

… que almacena en texto_leer toda la información contenida en el archivo referenciado como  contenido.

Pero si el contenido el archivo fuera una lista de palabras (por ejemplo) que ocupara varias líneas (por ejemplo, los días de la semana), podríamos usar el mismo procedimiento, pero obtendríamos un texto único, no una lista de los días de las semana (1). Si necesitamos acceder a la lista podemos optar por crearla (lista= []) y usar un bucle for para recorrer el archivo abierto añadiendo (lista.append()) cada elemento a la lista, o puedes optar por usar la función readlines() y ahorrarte el bucle (2).

En este segundo caso depende, como ya dije, de cómo está “escrito” el contenido en el archivo. Empecemos por la forma más simple, suponiendo que el contenido del archivo es un texto formado por uno o varios párrafos y que nuestro interés es usar ese contenido para informar al usuario del script sobre el funcionamiento del mismo. En este supuesto, necesitamos leer el contenido y pasarlo a una variable-cadena que después mostraremos en pantalla. Para ello, sobre texto_lista.txt (listado de días de la semana)…

archivo = ‘texto_lista.txt’
lineas = []
docum = open(archivo,’r’, encoding=‘utf-8’)
lineas = docum.realdlines()
lin = len(lineas)
print(f’Número de elementos de la lista {lin}\n’)
for i in range(lin):
    print(lineas[i].rstrip())
docum.close()

Este script devuelve una lista de elementos formada por el contenido de cada una de las líneas del documento. La función len() nos permite ver que esa lista consta de 7 elementos y sirve de referencia para limitar el número de ciclos que recorre for (for i in range(lín)) (3).

Si quieres confirmar que lineas es una lista y no una cadena de caracteres, sólo tienes que solicitar que se imprima un elemento mediante…

print(lineas[0]) -> Te devuelve lunes (4)

… pero lo realmente interesante es el conjunto de posibilidades que te ofrece el uso de lineas como lista.

NOTAS

(1) La diferencia puede que no la apreciemos si pedimos imprimir la variable usada como referencia (vg. texto_leer), pero sí si queremos acceder a un elemento concreto de la lista. Por ejemplo print(texto_leer[0]) no nos devuelve Lunes, nos devuelve l (primer elemento (0) de la cadena)
(2) También disponemos de la función readline(), que lee y devuelve caracteres en forma de cadena hasta encontrar un salto de línea (\n).
(3) Recuerda que rstrip() sirve para eliminar los saltos de línea
(4) Si lineas fuera una cadena devolvería l

sábado, 27 de septiembre de 2025

Textos. Python


E
scritura en archivos



Siguiendo con la lógica de la [entrada anterior], una vez creado (y abierto) el archivo deberemos proceder trasladar a él los datos generados por nuestro script, procedimiento llamado escritura (1). Dedicaremos esta entrada a explicar las diferentes formas que tenemos de escribir en un archivo txt desde un script de Python. 



Como sabemos, de las instrucciones que usamos como concreción del segundo parámetro de la función open(), tres nos permiten escribir (2) en el archivo: xw a

Cada una de ellas tiene un comportamiento particular, tanto respecto a la existencia previo (o no) del archivo, como al modo de trabajar con él.

  • La opción x (create) parece, en principio, ser la más apropiada, pero tiene un inconveniente: si el archivo que pretendemos crear ya existe, devuelve error, por lo que es necesario asegurar que dicho archivo no exista (3).
  • La opción w crea el archivo si éste no existe y no devuelve error, pero borrar lo que contenga y sitúa el cursor al inicio del archivo.
  • Por último, la opción a funciona igual que la anterior y tiene la ventaja de no alterar el contenido previo del archivo en caso de que éste exista, situando el cursor al final del archivo.
Sabiendo lo anterior podemos optar por la opción que mejor se ajuste a nuestras necesidades (4). Por ejemplo:
  • Si la prioridad es crear un nuevo archivo conociendo a ciencia cierta que no existe, cualquiera de las tres opciones es válida. x parece la más específica, pero en realidad las tres tienen, en este caso, el mismo comportamiento, ya que la posición del cursor dentro del archivo (posición de partida para escribir en él) siempre será el inicio del mismo (5).
  • Si lo que deseamos es continuar escribiendo en un archivo ya creado, la mejor opción es a, ya que nos garantiza que se respeta el contenido previo y que el nuevo se escribe a continuación.
  • Si nuestro cometido es mantener actualizado y sin redundancias un determinado archivo, la mejor opción es w, ya que nos garantiza que no se producirá error (como en el caso de x) si el archivo ya existe, y que siempre estará actualizado.
Vamos a explicar a continuación el proceso mismo de escritura, empezando por la la función write() en su uso más simple. Un ejemplo...

archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write('Pedro como plátanos')
archivo.close()

... una variación sobre el mismo tema, sustituyendo la cadena por la variable que la referencia...

frase ='Pedro come plátanos'

archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write(frase)
archivo.close()

... y una tercera formulación, más sofisticada e interactiva, pero en lo principal, la misma:

nombre = input('Dime el nombre de la persona: ')
verbo = input(f'¿Qué hace {nombre }? ')
objeto = input(f'¿Qué {verbo} {nombre} ')

frase = (f'{nombre} {verbo} {objeto}') #Concetana el contenido de las tres variables

archivo = open('texto1.txt','x', encoding='utf-8')
archivo.write(frase)
archivo.close()

También podemos trabajar con colecciones de datos y con bucles, previamente a la escritura del contenido en el archivo y en proceso de escritura.

Pensemos, por ejemplo, en una lista de vocabulario básico que almacenamos inicialmente en una lista y que después escribimos en un archivo.

rutas=['Pera',
        'Plátano',
        'Manzana',
        'Naranja',
        'Fresa'
        ]

archivo = open('texto1.txt','x', encoding='utf-8')

for fruta in frutas:
    archivo.write(fruta)

archivo.close()

Aunque este script nos permite crear, acceder y escribir en el archivo (texto1.txt), el problema que nos encontramos (al acceder al acceder al archivo) es el siguiente: PeraPlátanoManzanaNaranjaFresa. Todas las palabras se escribieron juntas, en una misma línea. Es posible que queramos que se escriban en una única línea, una detrás de otra (a modo de lista), pero lo que es seguro es que no nos interesa que aparezcan en un sólo bloque, como una única palabras. Incluso es posible que deseemos que cada una de ellas se escriba en una línea diferentes. Vamos a ver cómo lo podemos solucionar. 
  • Por ejemplo, si usamos la siguiente instrucción (archivo.write(' ')) tras (archivo.write(fruta)) obtendremos Pera Plátano Manzana Naranja Fresa. La razón: tras cada elemento de la lista escribimos un espacio mediante esa nueva instrucción.
  • Siguiendo este procedimiento, y manteniendo la escritura del listado en una misma línea, podemos añadir cualquier carácter o grupo de caracteres para separar cada elemento de la lista, como, por ejemplo sustituyendo (archivo.write(' ')) por (archivo.write('||')), con lo que obtendremos Pera||Plátano||Manzana||Naranja||Fresa||.
  • Y estarás pensando que si usas el carácter salto de línea es posible escribir la lista en diferentes líneas (archivo.write('\n')). Y estarás en lo cierto.
Pues bien, el mismo efecto que obtenemos con el uso del bucle (for fruta in frutas:) lo obtenemos usando la función join() como te muestro en el siguiente script (6)

frutas=['Pera',
        'Plátano',
        'Manzana',
        'Naranja',
        'Fresa'
        ]

archivo = open('texto1.txt','x', encoding='utf-8')

texto = '\n'.join(frutas) #Si no queremos saltos de línea podemos usar, por ejemplo '||'

archivo.write(texto)

archivo.close()

... con el que conseguimos el mismo efecto que con la anterior formulación del script con bucle (7).

Cuando el texto a guardar es de varias líneas, podemos usar el método writelines() en sustitución de writer(). También este método nos ahorra el uso del bucle, ya que escribe las múltiples líneas de las que puede estar compuesto un texto o los diferentes elementos de una lista...

frutas=['Pera',
        'Plátano',
        'Manzana',
        'Naranja',
        'Fresa'
        ]

archivo = open('texto1.txt','x', encoding='utf-8')

archivo.writelines(frutas)

archivo.close()

... pero tiene un problema: o modificamos la lista introduciendo "separadores" entre su elementos, o lo que se escribe es una única "palabra" (PeraPlátanoManzanaNaranjaFresa) (8)

Y ya puestos a ahorrar, si queremos prescindir de la función close() (archivo.close()) podemos recurrir with (9), como, por ejemplo...

frutas = ["Manzana\n", "Pera\n", "Plátano\n"]
with open("texto1.txt", 'w', encoding='utf-8') as archivo:
archivo.writelines(frutas)

... cuyas sentencias subordinadas (en este caso archivo.writelines(frutas)) podemos formular de formas similares a como hicimos en los ejemplos anteriores (10)

NOTAS 

(1) Por oposición al de recuperación del contenido del archivo o de lectura.
(2) Crear, si no está creado, y escribir en el archivo. x da error si el archivo ya existe, cosa que no sucede ni con a ni con w. La diferencia entre ambos se explica en el texto de la entrada.
(3) La función isfile() nos puede ayudar, ya que devuelve un valor booleano (True/False) que controla la posible existencia del archivo.
(4) Si mantenemos la lógica de lo que estamos haciendo (escribir sobre un archivo recién creado), cualquiera de las tres opciones nos vale, aunque en sentido estricto deberíamos usar x.
(5) Es posible que esta sea la causa de que en algunos manuales no se haga mención de la opción x, entendiéndola redundante en caso de inexistencia del archivo y potencialmente negativa en caso de duda al respecto. Esta es una observación personal no contrastada, por lo que ha de tomarse con reservas. Dada la importancia que tiene en el proceso de escritura (y lectura) conocer la posición que ocupa el cursor interno, Python dispone de funciones específicas para este fin. Estas opciones no van a ser tratadas en esta entrada, ya que tiene carácter introductorio, pero las explicaré cuando el objetivo de aprendizaje (y uso práctico) lo haga necesario.
(6) Observa que en este nuevo script han cambiado algunas cosas más que el bucle.
(7) Y si sustituimos '\n' por cualquier combinación de caracteres (vg texto = '||'.join(frutas) ) obtendremos resultados similares a las otras formulaciones de script: todos los elementos en la misma línea, separados por esos caracteres (vg, de  nuevo Pera||Plátano||Manzana||Naranja||Fresa||)
(8) Una posible solución es escribiendo la lista como sigue: frutas=['Pera', '\n','Plátano','\n',       'Manzana','\n','Naranja','\n','Fresa']. En estos casos personalmente prefiero usar el bucle o la función join().
(9) Que realmente ahorra más que la instrucción archivo.close(), como se puede comprobar en la entrada.
(10) Aquí buscamos la forma extrema de simplificación del código que permite el uso de with para que se aprecie mejor el efecto indicado en 9. Puede que no sea el que mejor se acomode a tus necesidades.

Textos. Python.



Creación y acceso a archivos




Hasta este momento todo lo que hemos podido hacer desde Python ha sido efímero, perdiéndose los resultados por carecer de medios para almacenarlos. Tampoco hemos podido acceder a datos externos, salvo los que introduce el usuario mediante la función input(). Para evitar esto y aumentar la funcionalidad de nuestros primeros script (1) necesitamos escribir y leer archivos e los que se almacenen datos. Iniciamos en esta entrada una subsección donde trataremos sobre estas cuestiones de tanta importancia para nuestra creación de script en Python.


La forma básica por la que podemos empezar a trabajar es con la creación y manejo de archivos (documentos y/o registros de datos) en formato txt. 

Dado que partimos de cero y necesitamos tener un espacio donde guardar los datos generados por nuestro script, empezaremos, pues, por aprender a crear este tipo de archivo. Para ello usaremos la función open() que cumple la doble función de crear (de no existir) o abrir (si ya existe) un archivo txt.

Esta función requiere determinados parámetros, viendo condicionado su funcionamiento en función cuáles sean y cómo se concreten. veámoslos en detalle, empezando por el primero: el que concreta la ubicación y el nombre o identificador del archivo.

archivo = open('texto1.text') podría ser la formulación más básica de este parámetro, indicando, en este caso, que el archivo txt se ubica en el mismo directorio en el que se encuentra el script.

Otro tanto conseguimos con la instrucción archivo = open('./texto1.text') que remite a la misma ubicación.

 Esta segunda forma de expresión nos lleva a plantear la posibilidad de ubicar nuestro archivo (o a buscar su ubicación) en un subdirectorio dependiente de aquel en que se encuentra nuestro script (vg. archivo = open('textos/texto1.text'))

Y también ubicarlo en cualquier directorio usando una dirección absoluta (vg. archivo =open('C:/Users/NombreUsuario/Escritorio/texto1.txt') (2)

No obstante, tal y como están escrita esta instrucción en cualquiera de sus posibles formulaciones no funciona (devuelve error), ya que para ello precisa de un segundo parámetro. Además, este segundo parámetro condiciona el funcionamiento de la propia función y de lo que se puede hacer desde el script con el archivo txt.

Me refiero a una serie de comandos, que explico a continuación. Dichos comandos son cuatro, dos para especificar el tipo de fichero (texto o binario) y uno complementario que comprende los dos modos principales  de trabajo: la lectura y la escritura de los archivos.
  • "r(read) es la opción que utiliza Python por defecto (si no se especifica nada) y nos permite abrir un fichero para lectura, pero da error si este fichero no existe. Por ello, en el caso en que nos encontramos ahora (creando el archivo txt) no sería adecuado, ya que sabemos de antemano que el fichero existe.
  • "w" (write) abre un fichero para escritura borrando (3) la información que pudiera contener. Si el fichero no existe, lo crea, por lo que es útil para crear nuevos archivos (como es el caso) y cuando trabajamos con archivos externos que interesa modificar sin acumular versiones diferentes del mismo.
  • "x" (create) crea un fichero para escribir en él. Si el fichero ya existe devuelve error, por lo que, al contrario que con "r", necesitamos saber que el fichero no existe. Por ello también no sirve para nuestro propósito actual, ya que es útil para generar nuevos archivos externos en los que guardar la información generada por el script, siempre y cuando sea necesario crear nuevos ficheros en cada proceso.
  • "a" (append) abre un fichero ya creado para escribir en él situando el cursor al final de su contenido, por lo que no se altera el contenido previo. Esto hace que sea útil cuando queremos añadir la información a la previamente guardada (incluyendo la generada por script diferentes al actual).
Los dos comandos relativos al tipo de contenido (texto o binario) son los siguientes:
  • "b" (binary) abre el fichero en modo binario (valores 0-1 en lugar de texto plano); ficheros como fotografías, archivos ejecutables, ficheros de LO-Writer o MO-Word, por ejemplo. 
  • "t" (text-mode) abre el fichero en modo texto plano.
Finalmente el signo "+" (4) abre el archivo en modo lectura y escritura simultáneamente.

El tercer parámetro es opcional, pero la mayoría de las veces muy necesario. Me refiero a encoding (codificación), que indica qué tipo de codificación o juego de caracteres se va a usar en el archivo (5). La concreción más frecuente de este parámetro es como utf-8

En resumen, el proceso de creación de un archivo .txt, quedaría como sigue (por ejemplo): archivo = open('textos/texto1.txt','w', encoding='utf-8')

Una vez creado (y abierto) el archivo podremos realizar con él las acciones permitidas por el segundo parámetro que hayamos empleado en la función open(), lo que, en esencia, se reduce a escribir y leer (de diferentes formas) el contenido del archivo, temas estos de los que me ocuparé en próximas entradas.

En todo caso, dado que el archivo está abierto, una vez que hayamos realizado las acciones que precisemos, deberemos cerrarlo, evitando así que quede innecesariamente abierto, consumiendo recursos RAM del sistema. Para ello haremos uso de la función close(), que expresaremos como sigue:

archivo.close()
 
... siendo, como es, archivo la variable que contiene la identificación del documento.

 

NOTAS

(1) Y en buena lógica, empezar a pensar en crear algo de utilidad práctica. Por suerte, y aunque sea aun de forma muy limitada, no nos falta mucho para obtener resultados prácticos con Python.
(2) Donde tu nombre de usuario sustituye a NombreUsuario. 
(3) En el momento de ejecutar la instrucción.
(4) Que también funciona como concreción del argumento.
(5) O, en su caso, a devolver del archivo.

jueves, 25 de septiembre de 2025

Demanda. Análisis.




Demanda de intervención del SEO





Modelo Asturias


Pensaba dejarlo para más adelante, pero la lógica se impone. Analizo en esta entrada el  documento-modelo para derivación al SEO para evaluación psicopedagógica que plantea la Consejería de Educación asturiana, en concreto, el documentos para el profesorado. Completa este análisis lo iniciado [en esta entrada], a la que remito para la descripción general del mismo.


Puede que algunas cosas de las que hable aquí hayan sido ya dichas (pido disculpas), pero posiblemente sea inevitable. En cualquier caso empezaré por comentar brevemente sobre el soporte y su forma.

Es de agradecer que la Consejería se muestre interesada en facilitar el trabajo a los docentes, facilitando el documento en un soporte accesible y de fácil manejo. También es de agradecer que ese interés se muestre también en el uso de tablas e incluso en la inclusión de algunos campos en forma de controles de formulario. No obstante se pueden mejorar ambas funcionalidades construyendo el documento sobre una única tabla, lo que facilitaría el desplazamiento del cursor (sólo sería necesario usar el tabulador para desplazarse por todo el documento.

Por el contrario, el uso de campos de formulario resultan de escasa utilidad, ya que aportan poco donde no sobran (1)

A donde no llegó la generosidad de la Administración es a tener en cuenta al destinatario del documento y el modo en que puede hacer uso de documento. Cierto que no es únicamente responsabilidad de la Consejería (también lo es el modo en que los centros utilicen el documento), pero no habría estado de más que la autoridad (que para eso lo es) hubiera indicado, mediante instrucciones de uso algún, que el procedimiento debe tener en cuenta a los SEO como destinatarios de esta información, facilitándoles el acceso directo al contenido del documento (2).

También hay aspectos positivos. Uno de ellos, a mi entender, es que este documento-modelo plantea una reducido demanda de datos de identificación: cuatro campos son más que suficientes, teniendo en cuenta otros (centro, fecha de emisión y tutor) quedan recogidos o son fáciles de inferir.

Lo que no queda tan claro es cómo se pretende que el profesorado aporte su análisis de las características y de las dificultades del alumno, ya que parecen repetitivos algunos de los epígrafes del documento al respecto y otros presentan una redacción un tanto confusa.

Como ejemplo, en Valoración inicial... parece pedirse (al menos en parte) la misma información que se reitera en el apartado siguiente (en lo que se refiere al análisis del nivel de competencia curricular) y de nuevo en el apartado Justificación de la propuesta... ¿No sería suficiente sólo uno de esos apartados?, ¿por qué insistir en reiterar lo mismo?. En otro caso, si lo que se pretende es que se aporten informaciones diferenciadas y complementarias, me temo que no se ha sabido expresar con claridad; pero personalmente creo que, además, ese supuesto planteamiento es innecesariamente complejo.

El problema de tomar como referencia para la viabilidad de la demanda el nivel de competencia curricular (ncc) (por área y como cuantificación) también es redundantea y no resuelve los problemas que este enfoque plantea, que ya traté  en parte [en esta entrada]:
  • ¿Qué aprendizajes concretos identifican lo nuclear del ncc característico de cada curso?, ¿se pretende dar respuesta a esta cuestión con la petición de adjuntar la valoración de cada área del currículo?
  • ¿Cuánto desfase tiene que presentar un alumno para considerar que es indicador de dificultades de aprendizaje y, en consecuencia, de necesidades educativas?, ¿se puede considerar igual el desfase al inicio de la etapa de E. Primaria que al final de la misma? (3) ¿implica esto que aceptamos cierto grado de desfase como irrelevante?, ¿acaso no se deberían planear intervenciones en cualquier caso, especialmente a nivel de aula, como programas preventivos y/o de refuerzo-recuperación?
  • Y lo que en la práctica es un problema relevante, ¿cómo relacionar desfase curricular (real) con calificaciones académicas, muchas veces no coincidentes?, ¿es posible afirmar que un alumno presenta 'cierto grado' de desfase curricular cuando sus calificaciones dicen lo contrario?.
Todas estas cuestiones están ahí, algunas incluso a pesar de resultar contradictorias, pero lo cierto es que se dan y no tenerlas en cuenta equivale, en realidad, a no dar respuesta a las necesidades educativas que presenta realmente un alumno, que puede terminar pagando por culpas que no tiene.

Incluir en todo este maremagnun de dudas y complejidades del ncc, la valoración del análisis del nivel competencial me parece cumplimiento formal de la normativa de evaluación (con su referencia a la evaluación de las competencias) que poco aporta a lo que nos ocupa. Además tengo dudas de que formalmente sea oportuno, ya que ciertas referencias legales referidas a la valoración de la consecución de niveles de logro competenciales se plantean para periodos y momento de la escolarización determinados, resultando irrelevantes para la determinación de desfases a corto-medio plazo. A más plazo (de desfase) no podemos esperar, si es que podemos esperar a alguno formalmente establecido (¿ciclo, que equivale a dos cursos de desfase?) para ser realmente efectivos y oportunos.

Cómo se plantea la cuestión de la intervención previa de apoyo ordinario (MAD ordinarias) queda un tanto oscurecido por la forma en que se expresa y por la duplicidad de momentos en que se plantea.

En un primer momento (Valoración inicial...) se plantea aparentemente como análisis del Plan de Atención a la Diversidad del Centro (se supone que) en su aplicación en concreto al caso (4) y después (Respuesta educativa...) se vuelve sobre lo mismo desglosando por ámbitos la identificación de las medidas ¿adoptadas? (5).

Lo menos claro de todo es que no se explica si el no cumplimiento de las MAD ord. invalida la derivación o demanda dado que no se cumple el principio vigente (¿aun?) de que antes de adoptar una medida extraordinaria (como es la evaluación psicopedagógica) se deben haber adoptados las medidas ordinarias oportunas. Por cierto que algunas de las que se proponen como tales son de obligado cumplimiento en función de unas condiciones dadas, por lo que se entiende que se deban cumplir por principio, evidenciando, en caso contrario, el incumplimiento de la norma (6).

Además aunque la lógica y el sentido del anterior planteamiento son innegables, su aplicación práctica no siempre puede ser lineal y simple. En todo caso, la Administración educativa debería aclarar explícitamente y no de forma velada cual es su postura al respecto, qué sentido tiene pedir ese tipo de información en la propia tramitación del documento y cuáles son sus consecuencias para el desarrollo del proceso que desencadena.
 
NOTAS

(1) Y es una pena, porque la intención es positiva. Pero hace falta otro tipo de formulación y planteamiento para que estos controles sea realmente funcionales. Aquí son, en el mejor de los casos, mero adorno.
(2) Lo digo porque el modelo de informe hace referencia a la obligación que tiene el SEO de informar de sus actuaciones con el profesorado. Y este documento es clave como fuente de información para la identificación de NEAE, por lo que la información que contiene (y el propio hecho de estar ahí) debe ser recogida en el informe psicopedagógico.
(3) ¿Teniendo en cuenta que en el primer ciclo se produce teóricamente el aprendizaje de lo nuclear de los aprendizajes instrumentales básicos? 
(4) Extraña forma de plantear la cuestión que da lugar a errores en la interpretación y a esfuerzos explicativo innecesarios e irrelevantes.
(5) Las dudas que plantea este epígrafe viene dadas por el enunciado inicial: "indíquese la atención educativa que se propone al alumno/a". ¿Qué se propone o que se han implementado?. Seguro que hay muchas formas más claras de explicar qué se pretende aquí.
(6) Es el caso de las dos que se citan asociadas a repetición o promoción de curso con áreas con calificación negativa.