<jupyter_start><jupyter_text>1. Introducción Hasta ahora hemos introducido la información directamente en nuestras líneas de código. Sin embargo, en la práctica esto limita la funcionalidad de nuestros programas. Es por esto que existen varias maneras de introducir datos a programas de Python. Los métodos existentes son:* Línea de comando: La información se introduce directamente a la terminal de la computadora.* Entrada estándar: Los programas toman información de otros programas.* Entrada por teclado: El usuario introduce manualmente información que pide el programa.* Entrada-salida por archivos: El programa puede leer y escribir directamente sobre archivos. En este curso nos enfocaremos en archivos de texto, pero se pueden usar otro tipo de archivos también (como archivos de audio).* Web: Se puede leer información directamente de sitios web.  2. Entrada por teclado Para pedirle al usuario que ingrese información desde su teclado, simplemente usamos la función `input()`. Lo que el usuario introduzca se guarda en una variable que puede ser utilizada después.<jupyter_code>n1 = input('Introduce un número: ')
n2 = input('Introduce un número: ')

n3 = int(n1) + int(n2) # define la suma entre enteros

print('La suma es:', n3) # imprime el resultado
# Este programa genera una letra aleatoria
# luego pide al usuario ingresar una letra 
# finalmente, el usuario debe advinar la letra generada
# aleatoriamente. Cuando esto suceda el programa termina.
import random

letras = 'abcdefghijklmnopqrstuvwxyz'

# toma una letra aleatoria
aleatoria = letras[random.randint(0, 25)] # aleatoria = letras[5] = f

# ejecuta mientras sea cierto
while True: 
  adivina = input('Escribe una letra minúscula: ') # z ingresada por usuario
  # checa que lo que se ingresó sí es una letra minúscula
  if adivina not in letras:
    print("Esto no es una letra minúscula.") 
    break
  # si se ingresó una letra minúscula, imprime "Bien"  
  if adivina == aleatoria: 
    print("Adivinaste la letra del programa :)")
    break
  # consejo: la letra del programa esta después, en orden alfabético
  if adivina > aleatoria:
    print("La letra secreta esta antes en el alfabeto.") 
  # consejo: la letra del programa esta antes, en orden alfabético
  else:
    print("La letra secreta esta después en el alfabeto.")<jupyter_output>Escribe una letra minúscula: z
La letra secreta esta después en el alfabeto.
Escribe una letra minúscula: f
La letra secreta esta después en el alfabeto.
Escribe una letra minúscula: a
La letra secreta esta antes en el alfabeto.
Escribe una letra minúscula: b
Adivinaste la letra del programa :)<jupyter_text>2. Cargar archivos A continuación estudiaremos cómo abrir archivos de texto para manipulación con Python.<jupyter_code># abre un archivo con extensión .txt
archivo = open('/content/drive/MyDrive/Intro a PLN/NLP - UNAM 2021/paises.txt','r')
# lee el archivo usando la función read()
lectura = archivo.read() 
# cierra el archivo
archivo.close() 
# imprime los contenidos del archivo ya guardados en la variable lectura
print(lectura) 
len(lectura)
variable = 'Escribe texto... '
# abre un archivo con extensión .txt
archivo = open('/content/drive/MyDrive/Intro a PLN/NLP - UNAM 2021/paises.txt','r')
# lee el archivo usando la función read()
lectura = archivo.read() 
# cierra el archivo
archivo.close() 

for linea in lectura:
  print('Número de letras en esta línea: ',
        len(linea), ',', linea)<jupyter_output><empty_output><jupyter_text>3. Librería Pandas: carga y exploración de bases de datos https://github.com/jpposadas/FakeNewsCorpusSpanish<jupyter_code>import pandas as pd
# Muy importante especificar la ruta en donde se 
# encuentra localizado el archivo a abrir

RUTA = '/content/drive/MyDrive/Intro a PLN/NLP - UNAM 2021/train.xlsx'

# Guarda la información del archivo de Excel en 
# una variable "archivo". Esta variable contendrá
# toda la información del archivo de Excel, y nos 
# permitirá manipular la información contenida en él.
archivo = pd.read_excel(RUTA)
archivo
archivo['Category'].value_counts()
archivo.info()
archivo.columns
archivo['Text'] # regresa sólo las primeras y últimas filas
archivo['Topic'].value_counts()<jupyter_output><empty_output><jupyter_text>Pandas permite cargar datos en diversos formatos. https://pandas.pydata.org/pandas-docs/stable/reference/io.html  4. Escritura en archivos Para escribir en un archivo, primero se debe crear (en caso de que no exista ya) en una ruta especificada. Una vez creado el nuevo archivo, se escriben en él los datos deseados. Finalmente, se debe cerrar el archivo, pues Python necesita saber explicitamente que los cambios han finalizado y se puede guardar el nuevo archivo.Si se desea escribir sobre un archivo ya existente, primero se debe abrir el archivo (como lo hicimos anteriormente). Luego, se escribe la información deseada, y finalmente se cierra el archivo.A continuación un ejemplo de cómo crear un nuevo archivo de texto en el que se guardarán dos líneas de texto.<jupyter_code># Muy importante especificar la ruta en donde se guardará el archivo nuevo
PATH = '/content/drive/MyDrive/...' # ingresar la ruta particular al Drive de cada usuario

# Abre el archivo nuevo
archivo_de_salida = open(PATH + '/archivo_prueba.txt','w') # la 'w' indica escritura (write)
# Escribe en el archivo
archivo_de_salida.write('algo de texto.\n') 
archivo_de_salida.write('...y más texto !\n') 
archivo_de_salida.close() # cierra el archivo<jupyter_output><empty_output><jupyter_text>Cuando se genera información a partir de un programa de Python, es conveniente guardar los resultados en un archivo .txt, pues esta extensión es ligera, fácil de cargar y de manipular por diversos lenguajes de programación. No es conveniente guardar resultados en archivos de Word, pues los archivos de Word contienen información que puede meter ruido a nuestros resultados. Otro formato conveniente es .csv, pues este permite ordenar la información en filas y columnas (como Excel, pero de una manera más eficiente y ligera. Excel tampoco es un formato conveniente).  5. EjercicioDe la base de datos cargada anteriormente, crear un nuevo archivo de texto (.txt) que contenga únicamente la columna "Text". La información en dicha columna debe empezar con una mayúscula, y el resto del texto debe estar en minúsculas. Asímismo, el archivo de texto debe contener, al final, la cuenta del número de veces que aparece la palabra "UNAM" en la columna "Text".<jupyter_code>columna_deseada = str(archivo['Text'])
columna_deseada
columna_deseada[100]
len(mayusculas)
textos = []

for fila in archivo['Text']:
  textos.append(fila)
len(textos)
textos[0]
contador = 0

for fila in textos:
  if 'UNAM' in fila:
    contador = contador + 1

print('La palabra UNAM aparece', contador, 'veces en total.')<jupyter_output>La palabra UNAM aparece 16 veces en total.<jupyter_text>fila = segundo elemento de la lista textostextos = lista con 676 elementosif 'UNAM' in primer elemento de la lista textoscontador = 0 +1 = 1<jupyter_code>formato = []

for fila in textos:
  minusculas = fila.lower()
  mayusculas = minusculas.capitalize()
  formato.append(mayusculas)
type(formato)
fila = textos[1]
fila
minusculas = fila.lower()
minusculas
mayusculas = minusculas.capitalize()
mayusculas
print(formato[0])
cuenta_UNAM = 'La palabra UNAM aparece ' + str(contador) + ' veces en total.'

formato.append(cuenta_UNAM)
print(formato[-1])
PATH = '/content/drive/MyDrive/...' # Ruta particular al Drive de cada usuario

# Abre el archivo nuevo
archivo_de_salida = open(PATH + '/archivo_final.txt','w')

# Escribe en el archivo
for fila in formato:
  archivo_de_salida.write(fila)

archivo_de_salida.close() # cierra el archivo<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07414596273291925, 'fraction_numerical': 0.005822981366459627, 'mean_word_length': 4.891006097560975, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 24, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '444026', 'license': 'MIT', 'n_tokens_mistral': 2650, 'n_tokens_neox': 2630, 'n_words': 975, 'path': 'Semana 4 input y output.ipynb', 'repo_name': 'dzarkV/CursoPLN-UNAM', 'size': '7728'}