Introducción a la programación - Archivos - 9 PDF
Document Details
Uploaded by DauntlessChrysoprase969
Tags
Summary
Este documento proporciona una introducción a la programación, centrándose en la gestión de archivos en Python, incluyendo la creación, escritura y lectura de archivos de texto y archivos CSV. Contiene ejemplos de código y explicaciones de conceptos clave.
Full Transcript
Introducción a la programación 9 Archivos Índice 9 Archivos...................................................................................................................................1 9.1 Introducción..........................................................................................
Introducción a la programación 9 Archivos Índice 9 Archivos...................................................................................................................................1 9.1 Introducción......................................................................................................................3 9.2 Escritura de archivos........................................................................................................3 9.3 Lectura de archivos..........................................................................................................5 9.4 CSV..................................................................................................................................6 9.4.1 Escribiendo CSV sin ayuda......................................................................................8 9.4.2 Escribiendo CSV......................................................................................................9 9.4.3 Leyendo CSV..........................................................................................................11 9.4.4 Leyendo CSV con DictReader................................................................................12 9.4.5 Ayudando a la interpretación del archivo...............................................................13 9.5 Ejercicios resueltos.........................................................................................................17 9.6 Ejercicios propuestos......................................................................................................19 Introducción a la programación Archivos - 2 Introducción a la programación 9.1 Introducción Parte de los requisitos más comunes de cualquier programa que realmente sea útil es el guardado de datos. El guardado de datos que veremos aquí será de dos tipos: formato texto, que puede ser muy útil también a su vez para formatos textuales como CSV (Comma Separated Values, valores separados por comas), y el formato binario. En cuanto a este último veremos el módulo Pickle, que permite representar cualquier valor u objeto creado mediante Python. 9.2 Escritura de archivos Para crear o abrir un archivo, se utiliza la función open(t1, t2). El primer parámetro es una cadena, que representa un nombre para un archivo. El segundo parámetro, otra cadena que representa la forma en la que se abrirá el archivo. Sintaxis f = open(, ) Carácter en modo Significado de apertura t Modo texto b Modo binario r Lectura w Escritura a Añadir al final La función open() devuelve un objeto archivo, del que se puede utilizar su método write() para escribir, o su método read() para leer. Por ejemplo, open(“f.txt”, “wt”) creará un archivo f.txt, para escribir texto, en caso de que no existiera previamente. En el caso de que exista, lo vuelve a crear, borrando el contenido existente. En caso de que no se desee este comportamiento, será necesario especificar at en lugar de wt para la cadena de formato. Archivos - 3 Introducción a la programación Ejemplo def escribe_archivo(nombre_archivo, datos): f = open(nombre_archivo, "wt") f.write(datos) f.close() if __name__ == “__main__”: escribe_archivo(“saludo.txt”, “hola”) Si ejecutamos el programa, al finalizar podremos comprobar que se ha creado el archivo saludo.txt con el contenido hola. Es importante acordarse de cerrar el archivo con el método close(), de manera que los datos que estén pendientes de ser escritos realmente se guarden en el archivo 1. Para no olvidarse, se puede utilizar la cláusula with… as, que se ocupará por nosotros de llamar a close(). # Escribe un mensaje en un archivo cualquiera def escribe_archivo(nombre_archivo, datos): with open(nombre_archivo, "wt") as f: f.write(datos) if __name__ == “__main__”: escribe_archivo(“saludo.txt”, “hola”) 1 Los ordenadores no acceden al disco en cuanto se les ordena, sino que procuran agrupar las operaciones de manera que se haga el menor número de accesos, debido a que los discos son más lentos que la memoria. A esto se le llama buffering. Archivos - 4 Introducción a la programación 9.3 Lectura de archivos def lee_archivo1(nombre_archivo): “””Devuelve una lista con el texto de cada línea. :param nombre_archivo: El nombre del archivo. ””” with open(nombre_archivo, "rt") as f: lineas = f.readlines() return lineas def lee_archivo2(nombre_archivo): “””Devuelve una lista con el texto de cada línea. :param nombre_archivo: El nombre del archivo. ””” toret = [] with open(nombre_archivo, "rt") as f: for l in f: toret += [l] return lineas if __name__ == "__main__": for l in lee_archivo2("datos.txt"): print(l) El programa abre el archivo datos.txt para leer en su interior, y lee el contenido del archivo, lo que se puede hacer de dos maneras. La primera es leer el archivo de una sola vez, obteniendo una lista en la que cada posición es una línea del archivo: para esto utiliza el método de conveniencia readlines(), que devuelve todas las líneas de texto en una lista. La segunda consiste en el bucle for, que también se puede utilizar para leer cada una de las líneas del archivo (en este caso se construye una lista con ellas). A continuación, se muestra una tabla con las funciones más importantes presentes en archivos. Método Explicación read(i) Lee i caracteres del archivo. readline() Lee una línea del archivo. readlines() Lee todo el archivo, devolviendo una lista de líneas. write(t) Escribe texto en un archivo. writelines(l) Guarda una lista de textos en un archivo. Archivos - 5 Introducción a la programación En el siguiente ejemplo, se crea un archivo datos.txt, en caso de que no exista, con el contenido Hola, mundo! Para saber si el archivo existe o no, se utiliza la función isfile(t) del módulo os.path. A continuación, se lee su contenido para posteriormente volcarlo en la pantalla. Ejemplo # Ejemplo completo sobre archivos import os def escribe_archivo(nombre_archivo, datos): with open(nombre_archivo, "wt") as f: f.write(datos) def lee_archivo(nombre_archivo): with open(nombre_archivo, "rt") as f: lineas = f.readlines() return lineas if __name__ == "__main__": if not(os.path.isfile("datos.txt")): escribe_archivo("datos.txt", "Hola, mundo!") for l in lee_archivo("datos.txt"): print(l) 9.4 CSV CSV es el acrónimo de Comma separated values, o lo que es lo mismo, valores separados por comas. Este es un estándar temprano para formatear valores en archivos de texto, de forma que, a pesar de seguir siendo texto, posea una cierta estructura. En el siguiente ejemplo, el contenido de un simple archivo de texto representa una matriz 3x3: 23, 45, 12 11, 23, 54 34, 56, 98 Los espacios antes o después del delimitador (la coma: ‘,’), se ignoran. La gran ventaja que tiene CSV es que es un formato legible por el ser humano, además de ser interpretable por un ordenador. En el siguiente ejemplo, el contenido de un archivo de texto es una tabla de ventas de productos. 1, 234576, 90 4, 234538, 190 9, 981276, 30 Archivos - 6 Introducción a la programación Pero un archivo en formato CSV no tiene por qué contener exclusivamente valores numéricos. El mismo archivo anterior podría tener la misma información en un formato ligeramente distinto. “Mes”, “Producto”, “Ventas” “ene”, 234576, 90 “abr”, 244538, 190 “sep”, 981276, 30 Normalmente, y debido a que por desgracia CSV no es un estándar estricto 2, los textos se entrecomillan (porque pueden contener espacios, o peor aún, el delimitador coma ‘,’), pero no es necesario. Además, la primera fila puede ser la de los nombres de las columnas… o no. Así, el archivo anterior se puede encontrar también de las siguientes forma, debido a que los textos en su interior no contienen espacios o delimitadores y que las cabeceras son opcionales. ene, 234576, 90 abr, 244538, 190 sep, 981276, 30 Mes, Producto, Ventas ene, 234576, 90 abr, 244538, 190 sep, 981276, 30 Es importante tener en cuenta que CSV ha tenido (o sufrido), diferentes variaciones a lo largo del tiempo. Por ejemplo, Microsoft Excel puede guardar normalmente los datos de una hoja de cálculo en CSV, pero al menos en su versión española, cuando se selecciona el formato CSV utiliza el carácter punto y coma como delimitador (‘;’). Esto es debido a que los países de habla inglesa utilizan el carácter punto (‘.’) como separador decimal, mientras que en países de habla inglesa se utiliza precisamente la coma con la misma función. Así, a la hora de guardar datos CSV en el formato español3, 4,5 y 9,5 se representarían como 4,5,9,5, lo que se interpretaría incorrectamente al leerlo como los cuatro valores enteros 4, 5, 9, y 5. De ahí que los autores de Excel decidieran utilizar ‘;’, representándose los datos anteriores como 4,5;9,5. Por otro lado, otro formato popular es el TSV o Tab separated values, es decir valores separados por tabuladores (representado por \t en un texto). La mayor parte de las veces este formato se asume como CSV utilizando \t como delimitador, lo que hace de forma efectiva que el hecho de utilizar la coma para separar valores (que es lo que indica su nombre), sea lo de menos. En cualquier caso, Python incorpora un módulo CSV que se encarga de leer y escribir archivos de este tipo, incluso teniendo en cuenta los problemas mencionados más arriba. 2 Lo más parecido a un estándar para CSV es el RFC 4180. CSV según la wikipedia: https://en.wikipedia.org/wiki/Comma-separated_values 3 La aproximación que se utiliza hoy en día es la de guardar siempre los datos en un formato neutro (es decir, el que se utiliza en el habla inglesa), y traducirlos al leerlos a las características locales presentes, lo cual hace que los datos sean perfectamente portables. Archivos - 7 Introducción a la programación 9.4.1 Escribiendo CSV sin ayuda Es posible escribir CSV sin mayores complicaciones, ya que es un formato muy sencillo. Aunque aquí se muestra un ejemplo, es siempre mejor utilizar la librería CSV que acompaña a Python, ya que es capaz de manejar ciertos casos especiales (cadenas con el delimitador en su interior, por ejemplo) automáticamente. Ejemplo # herramientas.csv def escritor_csv(f, datos, delimitador=','): for fila in datos: separador = "" for valor in fila: f.write(separador) if isinstance(valor, str): f.write('"') f.write(str(valor)) if isinstance(valor, str): f.write('"') separador = delimitador f.write('\n') if __name__ == "__main__": with open("datos.csv", "wt") as f: escritor_csv(f, [[1,2,3], [4,5,6], [7,8,9]]) El código anterior genera el archivo datos.csv que se muestra a continuación. Salida 1,2,3 4,5,6 7,8,9 El siguiente ejemplo es un poco más realista porque involucra datos de distinto tipo. Como se puede observar, las cadenas aparecen entrecomilladas, debido a los dos if’s que aparecen en el código. De nuevo hay que insistir en la utilidad de este ejemplo: CSV es un formato sencillo, y por tanto es interesante para ver cómo se puede crear fácilmente una herramienta que lo escriba o que lo lea, pero es siempre mucho más recomendable utilizar la librería de Python. Archivos - 8 Introducción a la programación Ejemplo import herramientas_csv as csv if __name__ == "__main__": with open("datos2.csv", "wt") as f: csv.escritor_csv(f, [["Mes","Producto","Ventas"], ["Ene",123456,150], ["Feb",435678,90], ["Mar",234442,210]]) Salida "Mes","Producto","Ventas" "Ene",123456,150 "Feb",435678,90 "Mar",234442,210 9.4.2 Escribiendo CSV Una vez creado el archivo de texto, se puede crear un escritor (writer), que con los parámetros adecuados, permite tan solo especificar los valores a escribir, y despreocuparse de los posibles problemas de formato. En cuanto a las diferencias con el código anterior, es necesario obtener el escritor de CSV de la función csv.writer(f). Ejemplo if __name__ == "__main__": import csv with open("datos.csv", "wt") as f: escritor_csv = csv.writer(f) escritor_csv.writerows([[1,2,3], [4,5,6], [7,8,9]]) Salida 1,2,3 4,5,6 7,8,9 El siguiente ejemplo, igual que en la sección anterior, es ligeramente más complicado al contener textos. Como se aprecia a continuación, la salida es ligeramente distinta. El motivo es que el escritor de CSV no incorpora, por defecto, los textos entrecomillados. Archivos - 9 Introducción a la programación Ejemplo if __name__ == "__main__": import csv with open("datos2.csv", "wt") as f: escritor_csv = csv.writer(f) escritor_csv.writerows([["Mes","Producto","Ventas"], ["Ene",123456,150], ["Feb",435678,90], ["Mar",234442,210]]) Salida Mes,Producto,Ventas Ene,123456,150 Feb,435678,90 Mar,234442,210 Existen varios parámetros que modifican el comportamiento del escritor de CSV. En particular, con respecto a los textos entrecomillados, podemos cambiar el parámetro quoting de QUOTE_MINIMAL, el valor por defecto, a QUOTE_NONNUMERIC, que entrecomilla todos los valores que no sean numéricos. El parámetro delimiter cambia el delimitador o separador entre valores. Valor del parámetro quoting Significado QUOTE_NONE No se entrecomilla absolutamente nada. QUOTE_MINIMAL Se entrecomilla solo cuando el texto incluye el delimitador. QUOTE_NONNUMERIC Entrecomilla los valores no numéricos. QUOTE_ALL Entrecomilla todos los valores. Valor del parámetro delimiter Significado “,” Coma: ‘,’ “;” Punto y coma: ‘;’. “\t” Tabulador. Archivos - 10 Introducción a la programación Ejemplo if __name__ == "__main__": import csv with open("datos2.csv", "wt") as f: escritor_csv = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) escritor_csv.writerows([["Mes","Producto","Ventas"], ["Ene",123456,150], ["Feb",435678,90], ["Mar",234442,210]]) Salida "Mes","Producto","Ventas" "Ene",123456,150 "Feb",435678,90 "Mar",234442,210 El método csv.Writer.writerows(l) acepta una lista de listas, de manera que interpreta cada lista interna como los valores de una sola línea, y el conjunto como todas las líneas. El método csv.Writer.writerow(l) acepta una lista simple, de manera que serán los valores a guardar para la fila actual. 9.4.3 Leyendo CSV El proceso de lectura es similar al de escritura, en el sentido de que es necesario crear un lector para que interprete el archivo CSV y devuelva una lista con todos los valores. Para que funcione bien, claro está, es necesario que se lea el archivo con los mismos parámetros con los que se creó. Acepta los mismos parámetros quoting y delimiter que los utilizados anteriormente con el escritor. El método para leer cambia ligeramente: mientras que con el escritor es posible elegir entre escribir todos los valores de una sola vez (csv.Writer.writerows(l)), o línea a línea (csv.Writer.writerow(l)), con el lector es obligatorio hacerlo línea a línea. Esto es especialmente interesante para aquellos archivos muy grandes de los que solo nos interesan ciertas líneas. Ejemplo if __name__ == "__main__": import csv toret = [] with open("datos.csv", "rt") as f: lector_csv = csv.reader(f) for linea in lector_csv: toret.append(linea) print(toret) Archivos - 11 Introducción a la programación Salida [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']] El anterior ejemplo lee el archivo de la matriz 3x3 creado en la sección anterior. En el siguiente ejemplo, leemos el archivo de las ventas de productos. Lo hacemos utilizando un diccionario, de manera que podamos clasificar inmediatamente los valores leídos (atendiendo a su orden). De esta manera, podemos realizar una salida tabulada de manera sencilla. Cada entrada en el diccionario tiene el valor de esa columna para la línea dada. Así, obtenemos una línea completa i con la entrada i de la columna mes, la entrada i de la columna producto, y la entrada i de la columna cantidad. Si el diccionario es toret, como en el ejemplo, la columna mes es toret[“mes”], y el valor en la segunda línea de dicha columna es toret[“mes”]. Ejemplo if __name__ == "__main__": import csv with open("datos2.csv", "rt") as f: lector_csv = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) toret = {"mes": [], "producto": [], "ventas": []} for i, linea in enumerate(lector_csv): if i > 0: toret["mes"].append(linea) toret["producto"].append(linea) toret["ventas"].append(linea) print(toret, "\n") print("Mes\tProducto\tCantidad") for i in range(len(toret["mes"])): print(toret["mes"][i] + "\t" + str(toret["producto"][i]) + "\t" + str(toret["ventas"][i])) Salida {'mes': ['Ene', 'Feb', 'Mar'], 'producto': [123456.0, 435678.0, 234442.0], 'cantidad': [150.0, 90.0, 210.0]} Mes Producto Cantidad Ene 123456.0 150.0 Feb 435678.0 90.0 Mar 234442.0 210.0 9.4.4 Leyendo CSV con DictReader En realidad, el proceso anterior de leer unos datos como si fuera un diccionario es tan común, que hay ya una clase sustituyendo a csv.Reader que lo hace: csv.DictReader. Cuando se utiliza esta clase, se lee automáticamente la primera línea del archivo, y se utiliza esta para deducir las cabeceras, es decir, el título de cada columna. Así, para cada fila, en lugar de obtener una lista, se obtiene un diccionario con los valores de esa fila para cada columna. Archivos - 12 Introducción a la programación Ejemplo if __name__ == "__main__": import csv with open("datos2.csv", "rt") as f: lector_csv = csv.DictReader(f, quoting=csv.QUOTE_NONNUMERIC) lineas = [] for linea in lector_csv: toret.append(linea) print("Mes\tProducto\tCantidad") for linea in lineas: print(linea["mes"] + "\t" + str(linea["producto"]) + "\t" + str(linea["ventas"])) Salida Mes Producto Cantidad Ene 123456.0 150.0 Feb 435678.0 90.0 Mar 234442.0 210.0 Una ventaja que tiene el hacerlo así es que no tenemos por qué conocer el orden en el que realmente están guardados las columnas, por lo que si en el futuro añadimos o eliminamos una columna, nuestro código no se verá afectado (excepto eliminar la lectura de la columna en el segundo caso). La clase csv.DictReader soporta los mismos parámetros que ya hemos visto: delimiter y quoting, principalmente. 9.4.5 Ayudando a la interpretación del archivo En ocasiones, encontraremos archivos CSV que por desgracia no son interpretados correctamente por la librería CSV de Python. Por ejemplo el siguiente archivo CSV, deniro.csv, que contiene los años, puntuaciones en Rotten Tomatoes y títulos de las películas protagonizadas por el actor Robert de Niro. "Year", "Score", "Title" 1974, 97, "The Godfather, Part II" 1976, 41, "The Last Tycoon" 1976, 99, "Taxi Driver" 1977, 47, "1900" 1977, 67, "New York, New York" 1978, 93, "The Deer Hunter" 1980, 97, "Raging Bull" 1981, 75, "True Confessions" Esta lista de películas tiene espacios en su interior. Si leemos el archivo CSV directamente con CSV según el siguiente programa: Archivos - 13 Introducción a la programación with open("deniro.csv", "rt") as f: reader = csv.DictReader(f, quoting=QUOTE_MINIMAL) for row in reader: print(row) La salida entonces sería: {'Year': '1974', '”Score”': ' 97', '”Title”': ' "The Godfather', None: [' Part II"']} {'Year': '1976', '”Score”': ' 41', '”Title”': ' "The Last Tycoon"'} {'Year': '1976', '”Score”': ' 99', '”Title”': ' "Taxi Driver"'} {'Year': '1977', '”Score”': ' 47', '”Title”': ' "1900"'} {'Year': '1977', '”Score”': ' 67', '”Title”': ' "New York', None: [' New York"']} {'Year': '1978', '”Score”': ' 93', '”Title”': ' "The Deer Hunter"'} {'Year': '1980', '”Score”': ' 97', '”Title”': ' "Raging Bull"'} Los espacios “extra” (en lugar de colocar los datos justo después de las comas, están confundiendo al parser de la librería CSV, y de hecho nos encontramos con que las cabeceras Score y Title incluyen las comillas dobles, el título de las películas incluye las comillas dobles, o que las puntuaciones incluyen los espacios precedentes. Otro problema es que algunos títulos incluyen comas y estas se interpretan como delimitadores. with open("deniro.csv", "rt") as f: reader = csv.DictReader(f, quoting=csv.QUOTE_MINIMAL) # Eliminar títulos “dobles” lineas = [] for row in reader: titulo2 = row.get(None) if titulo2: row[' "Title"'] += ", " + titulo2 del row[None] lineas.append(row) # Eliminar comillas y espacios extras for i, row in enumerate(lineas): lineas[i] = {k: v.strip("\"' ") for (k, v) in row.items()} print(row)...que produce la salida que se puede encontrar más abajo. El primer bucle elimina los títulos con segundas partes, de manera que los reúne en uno solo. Es sencillo porque como ni tiene un nombre de campo, le asigna None, por lo que solo es necesario concatenar ese segundo título con el original. Además, no tiene mucho sentido que los valores tengan esas comillas dobles, así que en el segundo bucle utilizamos una comprensión de diccionarios para eliminar los espacios y comillas sobrantes tanto al principio como al final. Para ello empleamos strip(), al que Archivos - 14 Introducción a la programación podemos pasarle como parámetro los caracteres a eliminar. De ahí que la llamemos con “\” ‘ “, para que elimine espacios, comillas simples o apóstrofes, y comillas dobles. {'Year': '1974', ' "Score"': '97', ' "Title"': 'The Godfather, Part II'} {'Year': '1976', ' "Score"': '41', ' "Title"': 'The Last Tycoon'} {'Year': '1976', ' "Score"': '99', ' "Title"': 'Taxi Driver'} {'Year': '1977', ' "Score"': '47', ' "Title"': '1900'} {'Year': '1977', ' "Score"': '67', ' "Title"': 'New York, New York'} {'Year': '1978', ' "Score"': '93', ' "Title"': 'The Deer Hunter'} {'Year': '1980', ' "Score"': '97', ' "Title"': 'Raging Bull'} Aunque empieza a verse bastante mejor, lo peor de todo es que los nombres de los campos title aparecen también con comillas dobles y un espacio delante. Para evitar esto, necesitamos precargar la cabecera (los nombres de los campos), y eliminarles también los espacios y comillas. Dado que csv funciona como un generador (se recorre la información con un bucle for), se puede obtener la primera línea del archivo (la que contiene los nombres de los campos) con next(). next(csv.reader(f) # [‘Year’, ‘ “Score”’, ‘ “Title”’] Podemos eliminar los espacios y comillas sobrantes con una comprensión de listas. header = [title.strip("\"' ") for title in next(csv.reader(f))] print(header) # [‘Year’, ‘Score’, ‘Title’] Y finalmente, inicializar DictReader con header, los nombres de los campos. A continuación, obtenemos el programa completo. with open("deniro.csv", "rt") as f: header = [title.strip("\"' ") for title in next(csv.reader(f))] reader = csv.DictReader(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL) lineas = [] for row in reader: titulo2 = row.get(None) if titulo2: row["Title"] += ", " + titulo2 del row[None] lineas.append(row) for i, row in enumerate(lineas): lineas[i] = {k: v.strip("\"' ") for (k, v) in row.items()} print(lineas[i]) Y finalmente obtenemos el resultado deseado: Archivos - 15 Introducción a la programación {'Year': '1974', 'Score': '97', 'Title': 'The Godfather, Part II'} {'Year': '1976', 'Score': '41', 'Title': 'The Last Tycoon'} {'Year': '1976', 'Score': '99', 'Title': 'Taxi Driver'} {'Year': '1977', 'Score': '47', 'Title': '1900'} {'Year': '1977', 'Score': '67', 'Title': 'New York, New York'} {'Year': '1978', 'Score': '93', 'Title': 'The Deer Hunter'} {'Year': '1980', 'Score': '97', 'Title': 'Raging Bull'} Dado que este proceso no puede generalizarse para todos los archivos, probablemente tengamos que hacer este proceso para el archivo como una inicialización, de manera que obtengamos un archivo que sea legible con el módulo csv sin necesidad de más adaptaciones. Archivos - 16 Introducción a la programación 9.5 Ejercicios resueltos 1. Escribe un programa que devuelve el número de palabras en un archivo de texto. # wc.py def wc(nf): """Devuelve el num. de palabras en un archivo. :param nf: el nombre del archivo :return: El num. De palabras, como entero. """ toret = 0 with open(nf, "rt") as f: for linea in f: toret += len(linea.strip().split()) return toret if __name__ == "__main__": print(“Palabras en el archivo:”, wc("wc.py")) Salida Palabras en el archivo: 48 2. Escribe un programa que calcule la frecuencia de aparición de cada palabra en un archivo introducido por teclado. # Frecuencias de palabras en un archivo def calcula_frecuencias_archivo(nombre): frecs = {} with open(nombre, "rt") as f: for texto in f: texto = texto.strip() # Tratar las vocales acentuadas texto = str.replace(texto, 'á', 'a') texto = str.replace(texto, 'é', 'e') texto = str.replace(texto, 'í', 'i') texto = str.replace(texto, 'ó', 'o') texto = str.replace(texto, 'ú', 'u') texto = str.replace(texto, 'ü', 'u') # Calcular las frecuencias palabras = texto.split() for palabra in palabras: if palabra not in frecs: frecs[palabra] = 1 else: frecs[palabra] += 1 return frecs if __name__ == "__main__": Archivos - 17 Introducción a la programación # Pedir el nombre del archivo nombre_archivo = input("Dame un nombre de archivo: ") nombre_archivo = str.lower(str.strip(nombre_archivo)) # Visualizar los resultados frecs = calcula_frecuencias_archivo(nombre_archivo) claves_ordenadas = list(dict.keys(frecs)) list.sort(claves_ordenadas) for k in claves_ordenadas: frec = frecs[k] print(str.format("Palabra '{0}' aparece: {1} vece(s).", k, frec)) Salida... Palabra '+=' aparece: 1 vece(s). Palabra '1' aparece: 2 vece(s). Palabra '=' aparece: 15 vece(s). Palabra '==' aparece: 1 vece(s). Palabra 'Calcular' aparece: 1 vece(s). Palabra 'Frecuencias' aparece: 1 vece(s). Palabra 'Pedir' aparece: 1 vece(s). Palabra 'Tratar' aparece: 1 vece(s). Palabra 'Visualizar' aparece: 1 vece(s). Palabra '__name__' aparece: 1 vece(s). Palabra 'acentuadas' aparece: 1 vece(s). Palabra 'aparece:' aparece: 1 vece(s). Palabra 'archivo' aparece: 2 vece(s). … Archivos - 18 Introducción a la programación 9.6 Ejercicios propuestos Los siguientes ejercicios son básicos y se pueden resolver conociendo los conceptos vistos hasta ahora. Tras cada enunciado, se muestra un ejemplo de la entrada y salida por pantalla del programa a escribir para que sirva de guía. 1. Crea un programa que permita contar cuantas veces aparece una palabra en un fichero de texto. 2. Escribe un programa que lea dos ficheros de texto y que genere un nuevo fichero de texto, el cual combina cada línea del primer fichero con la línea correspondiente en el segundo fichero. 3. Crea un programa que sea capaz de leer el fichero “pokemon.csv”. Usando las estructuras de datos que consideres más oportunas resuelve las siguientes consultas: a) crea una funcion que reciba como parámetro el fichero y un tipo y calcula el promedio de la velocidad, score de ataque y de defensa de dicho tipo entre todos los pokemon (puede ser tanto el tipo primario como el secundario) b) crea una función que reciba como parámetro la generación y un atributo de ordenación, que puede ser altura, o peso. La función debe listar el nombre de todos los pokemons de dicha generación, ordenados por el atributo de ordenación. ▪ Para esta última función, utiliza la siguiente documentación: import operator # Lista de diccionarios para ordenar my_list = [ {'name': 'John', 'age': 25}, {'name': 'Jane', 'age': 30}, {'name': 'Bob', 'age': 20}, ] # Ordenar la lista en base al atributo “age” sorted_list = sorted(my_list, key=operator.itemgetter('age')) print(sorted_list) Archivos - 19