3.4. Manejo de Ficheros#

Vamos a describir procedimientos para las siguientes cuestiones:

  • Leer el contenido de un fichero

  • Escribir información en un fichero

  • Añadir información a un fichero

Se van a utilizar la ficheros: Recuerde2.txt, numeros.txt, a18b.txt, a18b_utf-8.txt, listado.txt y palabras_español_utf-8.txt

Referencia

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files

3.4.1. Operaciones básicas con ficheros#

Nombre

Uso

Efecto

open con r

fichero = open(nombre_archivo,’r’)

abre el archivo “nombre_archivo” para lectura, genera una secuencia con las líneas del archivo y asigna al objeto creado a la variable “fichero”

open con w

fichero = open(nombre_archivo,’w’)

abre o crea el archivo “nombre_archivo” para escritura - borra el contenido del archivo si ya existiera

close

fichero.close()

cierra el archivo que se había abierto y elimina el objeto “fichero”

3.4.2. Lectura de ficheros#

Se genera un objeto con la función open() que toma por argumentos el nombre de un fichero y el parámetro r cuando se quiere leer (r -> read -> leer)

poema = open('Recuerde2.txt', 'r', encoding = 'utf8')
type(poema)
_io.TextIOWrapper

Esto objeto es un iterable y cada elemento es una línea del fichero. Vamos a guardar la información en una lista: cada línea sera un elemento de la lista que creemos

texto = []
for linea in poema:
    texto.append(linea)
texto
['Recuerde el alma dormida,\n',
 'avive el seso y despierte\n',
 'contemplando\n',
 'cómo se pasa la vida,\n',
 'cómo se viene la muerte\n',
 'tan callando;\n',
 'cuán presto se va el placer;\n',
 'cómo después de acordado\n',
 'da dolor;\n',
 'cómo a nuestro parecer\n',
 'cualquiera tiempo pasado\n',
 'fue mejor.\n',
 '\n',
 'Pues si vemos lo presente\n',
 'cómo en un punto se es ido\n',
 'y acabado,\n',
 'si juzgamos sabiamente,\n',
 'daremos lo no venido\n',
 'por pasado.\n',
 'No se engañe nadie, no,\n',
 'pensando que ha de durar\n',
 'lo que espera\n',
 'más que duró lo que vio,\n',
 'pues que todo ha de pasar\n',
 'por tal manera']

Al acabar esta operación es muy importante cerrar el fichero

poema.close()

Veamos que pasa si imprimimos una línea detrás de otra

for p in texto:
    print(p)
Recuerde el alma dormida,

avive el seso y despierte

contemplando

cómo se pasa la vida,

cómo se viene la muerte

tan callando;

cuán presto se va el placer;

cómo después de acordado

da dolor;

cómo a nuestro parecer

cualquiera tiempo pasado

fue mejor.



Pues si vemos lo presente

cómo en un punto se es ido

y acabado,

si juzgamos sabiamente,

daremos lo no venido

por pasado.

No se engañe nadie, no,

pensando que ha de durar

lo que espera

más que duró lo que vio,

pues que todo ha de pasar

por tal manera

Es destacable que cada elemento, aparte de tener los caracteres de cada línea contiene el carácter que se representa por los símbolos \n. Esto es un símbolo “invisible” con el que se indica que hay que empezar una nueva línea. Por esta razón aparece una línea en blanco al imprimir los elementos de la lista. El carácter que se representa con \n produce un línea nueva.

¿Como podemos deshacernos de él?

Veamos dos procedimientos

Primer procedimiento: añadir todos los caracteres de cada línea menos el último

texto_nuevo = []
for p in texto:
    texto_nuevo.append(p[:-1])
texto_nuevo
['Recuerde el alma dormida,',
 'avive el seso y despierte',
 'contemplando',
 'cómo se pasa la vida,',
 'cómo se viene la muerte',
 'tan callando;',
 'cuán presto se va el placer;',
 'cómo después de acordado',
 'da dolor;',
 'cómo a nuestro parecer',
 'cualquiera tiempo pasado',
 'fue mejor.',
 '',
 'Pues si vemos lo presente',
 'cómo en un punto se es ido',
 'y acabado,',
 'si juzgamos sabiamente,',
 'daremos lo no venido',
 'por pasado.',
 'No se engañe nadie, no,',
 'pensando que ha de durar',
 'lo que espera',
 'más que duró lo que vio,',
 'pues que todo ha de pasar',
 'por tal maner']

Veamos ahora que, efectivamente, ya no se imprime una línea en blanco.

for p in texto_nuevo:
    print(p)
Recuerde el alma dormida,
avive el seso y despierte
contemplando
cómo se pasa la vida,
cómo se viene la muerte
tan callando;
cuán presto se va el placer;
cómo después de acordado
da dolor;
cómo a nuestro parecer
cualquiera tiempo pasado
fue mejor.

Pues si vemos lo presente
cómo en un punto se es ido
y acabado,
si juzgamos sabiamente,
daremos lo no venido
por pasado.
No se engañe nadie, no,
pensando que ha de durar
lo que espera
más que duró lo que vio,
pues que todo ha de pasar
por tal maner

Segundo procedimiento: utilizar el método .strip() de las cadenas (https://docs.python.org/3/library/stdtypes.html#string-methods)

Cuando no se utiliza ningún argumento, este método elimina los caracteres en “blanco” delante y detrás de la cadena. En particular el carácter “invisble” correspondiente al cambio de línea, \n.

Algunos de los carateres “invisbles” son: , \t, \n, \r, \x0by \x0c.

import string
string.whitespace
' \t\n\r\x0b\x0c'

Con este segundo método haríamos lo siguiente:

texto_nuevo2 = []
for p in texto:
    texto_nuevo2.append(p.strip())
texto_nuevo
['Recuerde el alma dormida,',
 'avive el seso y despierte',
 'contemplando',
 'cómo se pasa la vida,',
 'cómo se viene la muerte',
 'tan callando;',
 'cuán presto se va el placer;',
 'cómo después de acordado',
 'da dolor;',
 'cómo a nuestro parecer',
 'cualquiera tiempo pasado',
 'fue mejor.',
 '',
 'Pues si vemos lo presente',
 'cómo en un punto se es ido',
 'y acabado,',
 'si juzgamos sabiamente,',
 'daremos lo no venido',
 'por pasado.',
 'No se engañe nadie, no,',
 'pensando que ha de durar',
 'lo que espera',
 'más que duró lo que vio,',
 'pues que todo ha de pasar',
 'por tal maner']

Si quiero que cada verso esté en una lista cuyos elementos son las palabras del correspondiente verso

lista = []
poema = open('Recuerde2.txt')
for linea in poema:
    verso = linea.strip()
    #lista.append(verso)
    lista.append(verso.split(' '))
poema.close()
lista
[['Recuerde', 'el', 'alma', 'dormida,'],
 ['avive', 'el', 'seso', 'y', 'despierte'],
 ['contemplando'],
 ['cómo', 'se', 'pasa', 'la', 'vida,'],
 ['cómo', 'se', 'viene', 'la', 'muerte'],
 ['tan', 'callando;'],
 ['cuán', 'presto', 'se', 'va', 'el', 'placer;'],
 ['cómo', 'después', 'de', 'acordado'],
 ['da', 'dolor;'],
 ['cómo', 'a', 'nuestro', 'parecer'],
 ['cualquiera', 'tiempo', 'pasado'],
 ['fue', 'mejor.'],
 [''],
 ['Pues', 'si', 'vemos', 'lo', 'presente'],
 ['cómo', 'en', 'un', 'punto', 'se', 'es', 'ido'],
 ['y', 'acabado,'],
 ['si', 'juzgamos', 'sabiamente,'],
 ['daremos', 'lo', 'no', 'venido'],
 ['por', 'pasado.'],
 ['No', 'se', 'engañe', 'nadie,', 'no,'],
 ['pensando', 'que', 'ha', 'de', 'durar'],
 ['lo', 'que', 'espera'],
 ['más', 'que', 'duró', 'lo', 'que', 'vio,'],
 ['pues', 'que', 'todo', 'ha', 'de', 'pasar'],
 ['por', 'tal', 'manera']]

Hay que destacar que primero hay que quitar el caracter de cambio de linea con el método .strip(). Después se descompone la corresponiente cadena a cada verso en palabras que formarán una lista con el método .split(). En este caso los cortes se hacen por la cadena del un espacio en blanco ' '.

3.4.2.1. Ejemplos#

  1. El fichero numeros.txt contiene datos para lectura. Leemos su contenido de diferentes maneras y obtendremos el resultado de diferentes operaciones con los números que contiene el fichero.

fichero=open('numeros.txt','r')

for linea in fichero:
    print(linea.strip())
    print(type(linea))

fichero.close()
<class 'str'>
0
<class 'str'>
1
<class 'str'>
2
<class 'str'>
3
<class 'str'>
4
<class 'str'>
5
<class 'str'>
6
<class 'str'>
7
<class 'str'>
8
<class 'str'>
9
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>
3
<class 'str'>
4
<class 'str'>
7
<class 'str'>

Observad, de nuevo, la diferenca de no utilizar o utilizar el método para cadenas .strip()

fichero = open('numeros.txt','r')

c1 = ''
for linea in fichero:
    c1 += linea
print(c1)
    
fichero.close()
0
1
2
3
4
5
6
7
8
9
3
4
7
3
4
7
3
4
7
3
4
7
3
4
7
3
4
7
3
4
7
3
4
7
3
4
7
fichero = open('numeros.txt','r')

c2 = ''
for linea in fichero:
    c2 += linea.strip()  
print(c2)

fichero.close()
0123456789347347347347347347347347347

Ahora escribimos una lista con los elementos del objeto que genera open() cuando no se “limpian” los elementos de ese objeto iterable con el método .srtrip().

fichero = open('numeros.txt','r')

contenido = []
for linea in fichero:
    contenido.append(linea)  

print(contenido)
print("hola"+"\n"+"adios")

fichero.close()
['\n', '0\n', '1\n', '2\n', '3\n', '4\n', '5\n', '6\n', '7\n', '8\n', '9\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n', '3\n', '4\n', '7\n']
hola
adios

Necesitamos quitar los saltos de línea que aparecen. El método .strip() elimina los espacios en blanco y los saltos de línea de una cadena

fichero=open('numeros.txt','r')

contenido=[]
for linea in fichero:
    contenido.append(linea.strip())  

print(contenido)

fichero.close()
['', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7']

Hemos conseguido construir una lista con las líneas que contenía el archivo. Ahora trabajaremos con ellas

fichero = open('numeros.txt','r')

contenido=[]

for linea in fichero:
    contenido.append(linea.strip()) 
suma = 0

for elemento in contenido[1:]:
    suma += int(elemento)

fichero.close()

print(suma/(len(contenido[1:])))
4.621621621621622
contenido
['',
 '0',
 '1',
 '2',
 '3',
 '4',
 '5',
 '6',
 '7',
 '8',
 '9',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7']

¿Quien es suma?

Definimos una función suma(lista) que tome el fichero anterior y devuelva suma de los números que contiene el fichero.

def suma(lista):
    fichero = open(lista,'r')
    contenido = []
    for linea in fichero:
        contenido.append(linea.strip()) 
    suma = 0
    for elemento in contenido[1:]:
        suma += int(elemento)
    fichero.close()
    return suma
suma("numeros.txt")
171
fichero = open('numeros.txt','r')

contenido = []
for linea in fichero:
    contenido.append(linea.strip()) 

s = int(contenido[1])+int(contenido[len(contenido)-1])  

fichero.close()

print(s)
7

¿Quien es s?

Definimos una función suma1(lista) que tome el fichero anterior y devuelva s

def suma1(lista):
    fichero = open(lista,'r')
    contenido = []
    for linea in fichero:
        contenido.append(linea.strip()) 
    s = int(contenido[1]) + int(contenido[len(contenido)-1])  
    fichero.close()
    return(s)
suma1("numeros.txt")
7
  1. El fichero a18b.txt contiene el listado de palabras del diccionario RAE que comienzan por a y tienen exactamente 18 letras.

fichero = open('a18b.txt','r')

fichero es un objeto que contiene las líneas de a18b.txt. Se puede iterar sobre él:

for linea in fichero:
    print(linea)
anarcosindicalismo

anarcosindicalista

anciconcepcionismo

anticonstitucional

antiinflaccionista

antonomásticamente

antropomorfización

autoabastecimiento
fichero.close()

Aunque Python ha imprimido las palabras contenidas en el fichero, ha dejado entre ellas una línea que no hemos pedido.

Si creamos una lista con las palabras de a18.txt veremos por que ocurre esto.

fichero = open('a18b.txt','r')
palabras18 = []
for u in fichero:
    palabras18.append(u)
    
fichero.close()

palabras18
['anarcosindicalismo\n',
 'anarcosindicalista\n',
 'anciconcepcionismo\n',
 'anticonstitucional\n',
 'antiinflaccionista\n',
 'antonomásticamente\n',
 'antropomorfización\n',
 'autoabastecimiento\n']

Vemos que al final de cada palabra aparece el símbolo \n. Ese símbolo tiene la función de indicarle a Python que salte a la línea siguiente.

Nosotros no lo necesitamos. Por ello, podemos crear la lista palabras18 de dos formas:

fichero = open('a18b.txt','r')
palabras18 = []
for u in fichero:
    palabras18.append(u[:-1])
    
fichero.close()

palabras18
['anarcosindicalismo',
 'anarcosindicalista',
 'anciconcepcionismo',
 'anticonstitucional',
 'antiinflaccionista',
 'antonomásticamente',
 'antropomorfización',
 'autoabastecimiento']

O también:

fichero = open('a18b.txt','r')
palabras18 = []
for u in fichero:
    palabras18.append(u.strip())
    
fichero.close()

palabras18
['anarcosindicalismo',
 'anarcosindicalista',
 'anciconcepcionismo',
 'anticonstitucional',
 'antiinflaccionista',
 'antonomásticamente',
 'antropomorfización',
 'autoabastecimiento']

El método strip() para cadenas elimina los espacios en blanco y saltos de línea al principio y final de la palabra.

3.4.3. Escritura en ficheros#

Nombre

Uso

Efecto

open con w

fichero = open(nombre_archivo,’w’)

abre o crea el archivo “nombre_archivo” para escritura creando el objeto “fichero” - borra el contenido del archivo si ya existiera

write

fichero.write(texto)

añade una línea con la cadena “texto” al archivo que se ha abierto usando el objeto “fichero”

Ahora se utliza la función open() con el argumento w (w -> write -> escribir).

numeros1_w = open('numeros1.txt', 'w')
numeros1_w.write('\n')
for p in range(3):
    numeros1_w.write(str(p) + '\n')

Al invocar open() con la opción w, se crea un fichero con el nombre especificado

Atención: si hubiera un fichero con el nombre especificado, desaparecería.

Como antes, una vez acabado le trabajo requerido, se debe cerrar el fichero.

numeros1_w.close()

Veamos si se ha guardado la información como se deseaba

numeros1_r = open('numeros1.txt', 'r')
numeros1 = []
for linea in numeros1_r:
    if len(linea.strip()) == 0:
        numeros1.append(linea.strip())
    else:
        numeros1.append(int(linea.strip()))
numeros1
['', 0, 1, 2]
numeros_r.close()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Input In [33], in <cell line: 1>()
----> 1 numeros_r.close()

NameError: name 'numeros_r' is not defined

3.4.3.1. Ejemplos#

  1. El fichero numeros.txt contiene números. Creamos un fichero nuevo divisiones.txt donde escribimos cada uno de los números del fichero numeros.txt dividido entre 2

fichero_n = open('numeros.txt','r')

contenido = []
for linea in fichero_n:
    contenido.append(linea.strip())  

fichero_n.close()
        
fichero_d = open('divisiones.txt', 'w')

fichero_d.write('Resultados de la división\n\n')

for u in contenido[1:]: 
    fichero_d.write(str(int(u)/2)+'\n')
        
fichero_d.close()

Observad que

contenido
['',
 '0',
 '1',
 '2',
 '3',
 '4',
 '5',
 '6',
 '7',
 '8',
 '9',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7']

Ahora se puede abrir el fichero divisiones.txt para ver que efectivamente contiene los números decimales que se obtienen al dividir por dos los números del fichero numeros.txt. Observad que la primera línea contiene el texto Resultados de la división, y después hay una línea en blanco; además la última también está en blanco.

Recordad

  • Una vez que abrimos un archivo para escritura se borra su contenido.

  • No debemos olvidar cerrar los ficheros una vez que hemos trabajado con ellos, podrían dañarse si no lo hacemos.

  • Es posible leer o escribir ficheros en directorios distintos del directorio de trabajo. Por ejemplo, si trabajos en el directorio CNP, contenido en el directorio Clases y queremos leer el archivo apuntes.txt del directorio EDM que también se encuentra en Clases, debemos escribir

    '../EDM/apuntes.txt'
    
  1. Creamos el fichero a18_mayusculas.txt donde escribimos las palabras de a18b.txt en letras mayúsculas. El contenido de este fichero lo volcamos, en un ejemplo anterior, en la lista palabras18.

fichero = open('a18_mayusculas.txt', 'w')

fichero.write('Palabras de 18 letras del idioma español en mayúsculas\n\n')
for u in palabras18:
    fichero.write(u.upper() + '\n')
    
fichero.close()

El fichero se guardará en el mismo directorio donde estamos trabajando.

3.4.4. Añadir información a un fichero#

Ahora se utiliza la opción a

Nombre

Uso

Efecto

open con a

fichero = open(nombre_archivo,’a’)

abre o crea el archivo “nombre_archivo” para escritura creando el objeto “fichero” - no borra el contenido del archivo si ya existiera

write

fichero.write(texto)

añade una línea con la cadena “texto” al final del archivo que se ha abierto para escritura

numeros_wa = open('numeros.txt', 'a')
for p in range(3):
    q = p**2 + 3
    numeros_wa.write(str(q) + '\n')
numeros_wa.close()
numeros_wa_r = open('numeros.txt', 'r')
numeros = []
for p in numeros_wa_r:
    numeros.append(p.strip())

numeros_wa_r.close()
numeros
['',
 '0',
 '1',
 '2',
 '3',
 '4',
 '5',
 '6',
 '7',
 '8',
 '9',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7',
 '3',
 '4',
 '7']

3.4.5. Códigos#

Linux o Mac suelen usar el código utf-8 para su los ficheros se producen. Sin embargo, Windows suele usar cp1252. Por esta, razón a veces será necesario utilizadr la opción encoding con el valor utf8 si estamos en Windows y el ficehro se ha creado en Linux o cp1252 si el fichero se ha creado en Windows y estamos en Linux.

fichero = open('a18.txt','r')
contenido = [elemento.strip() for elemento in fichero]
fichero.close()
contenido
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
Input In [42], in <cell line: 2>()
      1 fichero = open('a18.txt','r')
----> 2 contenido = [elemento.strip() for elemento in fichero]
      3 fichero.close()
      4 contenido

Input In [42], in <listcomp>(.0)
      1 fichero = open('a18.txt','r')
----> 2 contenido = [elemento.strip() for elemento in fichero]
      3 fichero.close()
      4 contenido

File /usr/lib/python3.8/codecs.py:322, in BufferedIncrementalDecoder.decode(self, input, final)
    319 def decode(self, input, final=False):
    320     # decode input (taking the buffer into account)
    321     data = self.buffer + input
--> 322     (result, consumed) = self._buffer_decode(data, self.errors, final)
    323     # keep undecoded input until the next call
    324     self.buffer = data[consumed:]

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position 107: invalid continuation byte

En este fichero no se utliza el código utf8; utiliza el código cp1252

fichero = open('a18.txt','r', encoding = 'cp1252')
contenido = [elemento.strip() for elemento in fichero]
fichero.close()
contenido
['anarcosindicalismo',
 'anarcosindicalista',
 'anciconcepcionismo',
 'anticonstitucional',
 'antiinflaccionista',
 'antonomásticamente',
 'antropomorfización',
 'autoabastecimiento']

Para saber qué codigo se está utilizando usar la función getpreferredencoding() del módulo locale

import locale
locale.getpreferredencoding()
'UTF-8'

Cuando se utilicen alguno de los ficheros de este curso en un sistema Windows habrá que utilizar la opción encoding = 'utf8'.

3.4.6. Ejemplos#

  1. Tenemos el fichero listado.txt donde se almacena el listado de las personas matriculadas en un curso. El listado contiene un nombre por línea:

    Ana María Gómez Ramírez

    Abelardo Suarez López

    Carlos Pérez Manzano

    Azucena Pinto Rodríguez

    Miriam García Cuesta

    …….

Queremos realizar las siguientes acciones

  • Leer el listado desde el fichero para crear una lista donde se almacenarán las notas

  • Imprimir un listado de alumnos con su correspondiente nota en el archivo notas.txt

Abrimos el archivo para lectura

fichero = open('listado.txt','r')

Creamos una lista con los nombres:

nombres = []
for linea in fichero:
    nombres.append(linea.strip())
    
fichero.close()

Creamos la lista notas con las notas correspondientes:

notas = [5,7.5, 6, 8, 4.5, 6, 3]

Creamos el archivo notas.txt con la función open(), escribimos en él con la opción w y cerramos el objeto fichero que acabamos de crear:

fichero = open('notas.txt', 'w')

fichero.write('NOTAS'.rjust(15) + '\n\n')
for u in range(len(nombres)):
    fichero.write(nombres[u].ljust(30) + str(notas[u]).ljust(3) + '\n')
    
fichero.close()
  1. Definir la función palabra_aleatoria(nombre_fichero) que devuelve una palabra escogida aleatoriamente del fichero nombre_fichero. Aquí, nombre_fichero es una cadena de texto con el nombre de un archivo que contiene una lista de palabras, una por línea.

def palabra_aleatoria(nombre_fichero):
    fichero = open(nombre_fichero, 'r')
    contenido = [u.strip() for u in fichero]
    fichero.close()
    from random import randint
    N = len(contenido)
    return contenido[randint(0, N - 1)] 

Llamamos la anterior para el archivo palabras_español_utf-8.txt

palabra_aleatoria('palabras_español_utf-8.txt')
'albuhera'

Como hemos dicho antes, si se produce un error, ejecutar la siguiente celda que permite conocer que codificación utiliza tu ordenador

import locale
locale.getpreferredencoding()
'UTF-8'

Si no devuelve utf8, habrá que utilizar fichero = open(lista, 'r', encoding = 'utf8') en la definición de la anterior función. Esta función devolverá cp1252 en Windows.

  1. Definir la función palabra_aleatoria_5(nombre_fichero) que devuelve una palabra de cinco letras escogida aleatoriamente del fichero nombre_fichero.

def palabra_aleatoria_5(nombre_fichero):
    while True:
        aux = palabra_aleatoria(nombre_fichero)
        if len(aux) == 5:
            break
    return aux
palabra_aleatoria_5('palabras_español_utf-8.txt')
'adaza'
  1. Definir la función palabras(nombre_fichero,N) que crea el fichero Npalabras.txt que contiene N palabras, una por línea, escogidas aleatoriamente del fichero nombre_fichero. Observad que en cada llamada de la función palabras() el segundo parámetro es un número entero.

def palabras(nombre_fichero, N):
    # creamos la lista aux con N palabras escogidas aleatoriamente
    fichero = open(nombre_fichero, 'r', encoding = 'utf8')
    contenido = [u.strip() for u in fichero]
    fichero.close()
    M = len(contenido)
    from random import randint
    aux = [contenido[randint(0, M - 1)] for u in range(N)]
    
    # creamos el fichero con la lista de palabras de aux
    fichero = open(str(N) + 'palabras.txt', 'w')
    for u in aux[:-1]:
        fichero.write(u + '\n')
    fichero.write(aux[-1])
    fichero.close()
palabras('palabras_español_utf-8.txt', 10)
  1. Definir la función mayor_longitud(nombre_fichero) que devuelve la mayor longitud de las palabras contendias en el fichero nombre_fichero.

def mayor_longitud(nombre_fichero):
    fichero = open(nombre_fichero, 'r', encoding = 'utf8')
    contenido = [u.strip() for u in fichero]
    fichero.close()
    aux = [len(u) for u in contenido]
    return max(aux)
mayor_longitud('palabras_español_utf-8.txt')
23

En los siguientes ejercicios, el archivo nombre_fichero es una cadena de texto con el nombre de un archivo que contiene una lista de números enteros, uno por línea.

  1. Definir la función mayor(nombre_fichero) que devuelve el mayor de los números contenidos en el fichero nombre_fichero.

Busquemos primero qué código debemos usar en la función que nos piden.

fichero = open('numeros.txt', 'r', encoding = 'utf8')
contenido = [u.strip() for u in fichero]
fichero.close()
print(contenido)
['', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7', '3', '4', '7']
contenido_i = [int(u) for u in contenido if u != '']
print(contenido_i)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7, 3, 4, 7]

Se ha de eliminar el caso en el que tengamos una línea en blanco. Al utilizar el método .striop() la línea en blanco se convierte en una cadena vacia.

def mayor(nombre_fichero):
    fichero = open(nombre_fichero, 'r', encoding = 'utf8')
    contenido = [int(u.strip()) for u in fichero if u.strip() != '']
    fichero.close()
    return max(contenido)
mayor('numeros.txt')
9
  1. Definir la función cuantos(nombre_fichero) que devuelve la cantidad de números contenidos en el fichero nombre_fichero.

def cuantos(nombre_fichero):
    fichero = open(nombre_fichero, 'r')
    contenido = [int(u.strip()) for u in fichero if u.strip() != '']
    fichero.close()
    return len(contenido)
cuantos('numeros.txt')
40
  1. Definir la función media(nombre_fichero) que devuelve la media de los números contenidos en el fichero nombre_fichero con dos decimales.

def media(lista):
    fichero = open(lista, 'r')
    contenido = [int(u.strip()) for u in fichero if u.strip() != '']
    fichero.close()
    return round(sum(contenido)/len(contenido), 2)
media('numeros.txt')
4.62

3.4.7. Ejercicios#

  1. Crear un archivo que contenga la tabla de multiplicar por 7 con el formato:

    7 x 1 = 7

    7 x 2 = 14

    7 x 3 = 21

    7 x 9 = 63

  2. Definir una función palabra_larga(nombre_fichero) que devuelva la palabra más larga en el fichero nombre_fichero. Utilizar el archivo palabras_español_utf-8.txtpara probar la función.

  3. Definir la función palabra_aleatoria(nombre_fichero) que devuelve una palabra escogida aleatoriamente del fichero nombre_fichero. Utilizar el archivo palabras_español_utf-8.txt para probar la función.

    Obs. Necesitamos la función randint() de la librería random. Utilizar la expresión from random import randint para cargar la librería.

  4. Definir la función cifrar(mensaje, resultado) que lee un texto del archivo mensaje.txt, lo cifra y lo escribe en el fichero resultado.txt. Para el cifrado, a cada letra se le hace corresponder la siguiente en el orden alfabético y a la z la a. Los signos de puntuación no se cambian. El mensaje no contiene vocales con tilde.

3.4.8. U3.4.6 Cuestionarios de Moodle#

Estadística de una encuesta