Manejo de Ficheros
Contents
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
, \x0b
y \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#
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
El fichero
a18b.txt
contiene el listado de palabras del diccionario RAE que comienzan pora
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#
El fichero
numeros.txt
contiene números. Creamos un fichero nuevodivisiones.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'
Creamos el fichero
a18_mayusculas.txt
donde escribimos las palabras dea18b.txt
en letras mayúsculas. El contenido de este fichero lo volcamos, en un ejemplo anterior, en la listapalabras18
.
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#
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()
Definir la función
palabra_aleatoria(nombre_fichero)
que devuelve una palabra escogida aleatoriamente del ficheronombre_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.
Definir la función
palabra_aleatoria_5(nombre_fichero)
que devuelve una palabra de cinco letras escogida aleatoriamente del ficheronombre_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'
Definir la función
palabras(nombre_fichero,N)
que crea el ficheroNpalabras.txt
que contieneN
palabras, una por línea, escogidas aleatoriamente del ficheronombre_fichero
. Observad que en cada llamada de la funciónpalabras()
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)
Definir la función
mayor_longitud(nombre_fichero)
que devuelve la mayor longitud de las palabras contendias en el ficheronombre_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.
Definir la función
mayor(nombre_fichero)
que devuelve el mayor de los números contenidos en el ficheronombre_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
Definir la función
cuantos(nombre_fichero)
que devuelve la cantidad de números contenidos en el ficheronombre_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
Definir la función
media(nombre_fichero)
que devuelve la media de los números contenidos en el ficheronombre_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#
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
Definir una función
palabra_larga(nombre_fichero)
que devuelva la palabra más larga en el ficheronombre_fichero
. Utilizar el archivopalabras_español_utf-8.txt
para probar la función.Definir la función
palabra_aleatoria(nombre_fichero)
que devuelve una palabra escogida aleatoriamente del ficheronombre_fichero
. Utilizar el archivopalabras_español_utf-8.txt
para probar la función.Obs. Necesitamos la función
randint()
de la libreríarandom
. Utilizar la expresión from random import randint para cargar la librería.Definir la función cifrar(mensaje, resultado) que lee un texto del archivo
mensaje.txt
, lo cifra y lo escribe en el ficheroresultado.txt
. Para el cifrado, a cada letra se le hace corresponder la siguiente en el orden alfabético y a laz
laa
. Los signos de puntuación no se cambian. El mensaje no contiene vocales con tilde.