Manjeo de Archivos en Python
Manjeo de Archivos en Python
archivo = open("archivo.txt")
Esta función intentará abrir el archivo con el nombre indicado. Si tiene éxito, devolverá
una variable que nos permitirá manipular el archivo de diversas maneras.
La operación más sencilla a realizar sobre un archivo es leer su contenido. Para
procesarlo línea por línea, es posible hacerlo de la siguiente forma:
línea=archivo.readline()
while línea != '':
# procesar línea
línea=archivo.readline()
Esto funciona ya que cada archivo que se encuentre abierto tiene una posición
asociada, que indica el último punto que fue leído. Cada vez que se lee una línea, avanza esa
posición. Es por ello que readline() devuelve cada vez una línea distinta y no siempre la
misma.
De esta manera, la variable línea irá almacenando distintas cadenas correspondientes a cada
una de las líneas del archivo.
Es posible, además, obtener todas las líneas del archivo utilizando una sola llamada a función:
líneas = archivo.readlines()
En este caso, la variable líneas tendrá una lista de cadenas con todas las líneas del archivo.
11.1. Cerrar un archivo
Al terminar de trabajar con un archivo, es recomendable cerrarlo, por diversos motivos: en
algunos sistemas los archivos sólo pueden ser abiertos de a un programa por la vez; en otros,
lo que se haya escrito no se guardará realmente hasta no cerrar el archivo; o el limite de
cantidad de archivos que puede manejar un programa puede ser bajo, etc.
archivo.close()
La llamada a rstrip es necesaria ya que cada línea que se lee del archivo contiene un fin de
línea y con la llamada a rstrip("\\n") se remueve.
NotaLos archivos de texto son sencillos de manejar, pero existen por lo menos tres formas
distintas de marcar un fin de línea. En Unix tradicionalmente se usa el carácter \n (valor de
ASCII 10, definido como nueva línea) para el fin de línea, mientras que en Macintosh el fin de
línea se solía representar como un \r (valor ASCII 13, definido como retorno de carro) y en
Windows se usan ambos caracteres \r\n.
Si bien esto es algo que hay que tener en cuenta en una diversidad de casos, en particular en
Python por omisión se maneja cualquier tipo de fin de línea como si fuese un \n, salvo que se
le pida lo contrario. Para manejar los caracteres de fin de línea a mano se puede poner
una U en el parámetro modo que le pasamos a open.
Otra opción para hacer exactamente lo mismo seria utilizar la función de Python
`enumerate(secuencia). Esta función devuelve un contador por cada uno de los elementos que
se recorren, puede usarse con cualquier tipo de secuencia, incluyendo archivos. La versión
equivalente se muestra en el Código 11.2.
Modo de sólo lectura (r). En este caso no es posible realizar modificaciones sobre el archivo,
solamente leer su contenido.
Modo de sólo escritura (w). En este caso el archivo es truncado (vaciado) si existe, y se lo crea
si no existe.
Modo sólo escritura posicionándose al final del archivo (a). En este caso se crea el archivo, si
no existe, pero en caso de que exista se posiciona al final, manteniendo el contenido original.
Por otro lado, en cualquiera de estos modos se puede agregar un + para pasar a un modo
lectura-escritura. El comportamiento de r+ y de w+ no es el mismo, ya que en el primer caso se
tiene el archivo completo, y en el segundo caso se trunca el archivo, perdiendo así los datos.
En caso de que no se especifique el modo, los archivos serán abiertos en modo sólo lectura
(r).
AdvertenciaSi un archivo existente se abre en modo escritura (w o w+), todos los datos
anteriores son borrados y reemplazados por lo que se escriba en él.
6.5. Nuestro primer juego
Con todo esto ya estamos en condiciones de escribir un programa para jugar con la
computadora: el Mastermind. El Mastermind es un juego que consiste en deducir un código
numérico de (por ejemplo) cuatro cifras.
Cada vez que se empieza un partido, el programa debe "eligir" un número de cuatro cifras
(sin cifras repetidas), que será el código que el jugador debe adivinar en la menor cantidad de
intentos posibles. Cada intento consiste en una propuesta de un código posible que tipea el
jugador, y una respuesta del programa. Las respuestas le darán pistas al jugador para que
pueda deducir el código.
Estas pistas indican cuán cerca estuvo el número propuesto de la solución a través de dos
valores: la cantidad de aciertos es la cantidad de dígitos que propuso el jugador que también
están en el código en la misma posición. La cantidad de coincidencias es la cantidad de digitos
que propuso el jugador que también están en el código pero en una posición distinta.
Por ejemplo, si el código que eligió el programa es el 2607, y el jugador propone el 1406, el
programa le debe responder un acierto (el 0, que está en el código original en el mismo lugar,
el tercero), y una coincidencia (el 6, que también está en el código original, pero en la
segunda posición, no en el cuarto como fue propuesto). Si el jugador hubiera pro-puesto
el 3591, habría obtenido como respuesta ningún acierto y ninguna coincidencia, ya que no hay
números en común con el código original, y si se obtienen cuatro aciertos es porque el
jugador adivinó el código y ganó el juego.
2. Especificación:
2. Diseño:
Lo primero que tenemos que hacer es indicarle al programa que tiene que "elegir" un número
de cuatro cifras al azar. Esto lo hacemos a través del módulo random. Este módulo provee
funciones para hacer elecciones aleatorias.
La función del módulo que vamos a usar se llama choice. Esta función devuelve un elemento
al azar de una n-upla, y toma como parámetro la n-upla de la que tiene que elegir. Vamos a
usarla entonces para elegir cifras. Para eso tenemos que construir una n-upla que tenga todas
las cifras, lo hacemos de la misma manera que en la parte 3.6:
digitos = ('0','1','2','3','4','5','6','7','8','9')
Como están entre comillas, los dígitos son tratados como cadenas de caracteres de
longitud uno. Sin las comillas, habrían sido considerados números enteros. En este caso elegi-
mos verlos como cadenas de caracteres porque lo que nos interesa hacer con ellos no son
cuentas sino comparaciones, concatenaciones, contar cuántas veces aparece o donde está en
una cadena de mayor longitud, es decir, las operaciones que se aplican a cadenas de texto.
Entonces que sean variables de tipo cadena de caracteres es lo que mejor se adapta a nuestro
problema.
Ahora tenemos que generar el número al azar, asegurándonos de que no haya cifras
repetidas. Esto lo podemos modelar así:
Finalmente, cuando el jugador acierta el código elegido, hay que dejar de pedir
propuestas, informar al usuario que ha ganado y terminar el programa.
# "elegimos" el codigo
codigo = ''
for i in range(4):
candidato = random.choice(digitos)
# vamos eligiendo digitos no repetidos*
while candidato in codigo:
candidato = random.choice(digitos)
codigo = codigo + candidato
TrucoCuando lo que queremos escribir es demasiado largo como para una sola línea que
entre cómodamente en el editor o en el campo visual, le indicamos al intérprete que
queremos seguir en la siguiente línea por medio de la barra invertida (como al final anterior
que empieza por "Tu propuesta ...).
Para probar estas cosas recurrimos a la depuración del programa. Una forma de hacerlo es
simplemente agregar algunas líneas en el código que nos informen lo que está sucediendo
que no podemos ver. Por ejemplo, los números que va eligiendo al azar y el código que
queda al final. Así podremos verificar si las respuestas son correctas a medida que las
hacemos y podremos elegir mejor las propuestas enlas pruebas.
# "elegimos" el codigo
codigo = ''
for i in range(4):
candidato = random.choice(digitos)
# vamos eligiendo digitos no repetidos
while candidato in codigo:
print 'DEBUG: candidato =', candidato
candidato = random.choice(digitos)
codigo = codigo + candidato
print 'DEBUG: el codigo va siendo =', codigo
De esta manera podemos monitorear cómo se va formando el código que hay que adivinar, y
los candidatos que van apareciendo pero se rechazan por estar repetidos:
Para empezar, habría que reemplazar el 4 en la línea 11 del programa por un 5, indicando que
hay que elegir 5 dígitos al azar. Pero además, el ciclo en la línea 31 también necesita cambiar
la cantidad de veces que se va a ejecutar, 5 en lugar de 4. Y hay un lugar más, adentro del
mensaje al usuario que indica las instrucciones del juego en la línea 20.
Una forma de evitar esto es fijar la cantidad de cifras en una variable y cambiarla sólo ahí:
# "elegimos" el codigo
cant_digitos = 5
codigo = ''
for i in range(cant_digitos):
candidato = random.choice(digitos)
# vamos eligiendo digitos no repetidos
El mensaje al usuario queda entonces:
# iniciamos interaccion con el usuario
print "Bienvenido/a al Mastermind!"
print "Tenes que adivinar un numero de", cant_digitos,
"cifras distintas"
Y el chequeo de aciertos y coincidencias:
# recorremos la propuesta y verificamos en el codigo
for i in range(cant_digitos):
if propuesta[i] == codigo[i]:
Con 5 dígitos, el juego se pone más difícil. Nos damos cuenta que si el jugador no logra
adivinar el código, el programa no termina: se queda preguntando códigos y respondiendo
aciertos y coincidencias para siempre. Entonces queremos darle al usuario la posibilidad de
rendirse y saber cuál era la respuesta y terminar el programa.
Para esto agregamos en el ciclo while principal una condición extra: para seguir pregun-
tando, la propuesta tiene que ser distinta al código pero además tiene que ser distinta del
texto "Me doy".
# "elegimos" el codigo
cant_digitos = 5
codigo = ''
for i in range(cant_digitos):
candidato = random.choice(digitos)
# vamos eligiendo digitos no repetidos
while candidato in codigo:
candidato = random.choice(digitos)
codigo = codigo + candidato