miad4.png

Hide code cell source
import os
# Por precaución, cambiamos el directorio activo de Python a aquel que contenga este notebook
if "PAD-book" in os.listdir():
    os.chdir(r"PAD-book/Laboratorio-Computacional-de-Analytics/S2 - Funciones, manejo de archivos y visualizacion/S2.TU2/")

Manejo de archivos de texto#

Todo proyecto de analítica de datos parte de tener acceso a datos, ya sea a partir de Internet, de una base de datos, o de archivos locales. Aunque existen paquetes especializados que facilitan la interacción con fuentes de datos, es importante conocer las herramientas básicas de Python para importar y exportar archivos.

Requisitos#

Para desarrollar este tutorial necesitarás:

  • Utilizar listas y diccionarios.

  • Implementar condicionales y ciclos.

Objetivos#

Al final de este tutorial podrás:

1. Aplicar los métodos y los atributos principales de las cadenas de texto.
2. Importar y exportar archivos de texto en formato .txt o .csv por medio de un file handle.
3. Procesar archivos de texto delimitados y no delimitados valiendose del uso de los métodos de las cadenas de texto y de los file handle.

1. Cadenas de caracteres#

Dado que la lectura de archivos usualmente implica trabajar con cadenas de caracteres (str), señalaremos algunas características de estas para ampliar nuestro conocimiento de las cadenas de caracteres. Esencialmente, una cadena de caracteres es una estructura de datos ordenada e inmutable con un índice numérico, por lo que vienen compartiendo características similares a las tuplas. Siendo que son ordenadas, heredan las propiedades de rebanado que conocemos.

Ejemplo 1#

A partir de la cadena de caracteres “Stack Overflow es un portal web muy útil para solucionar dudas de Python” requerimos:

  • Encontrar el primer carácter de la cadena de caracteres.

  • Encontrar el último carácter de la cadena de caracteres.

  • Extraer la palabra “Python” de la cadena de caracteres.

Resolvemos estos requerimientos utilizando el siguiente código.

texto = "Stack Overflow es un portal web muy útil para solucionar dudas de Python"
print("El primer carácter de la cadena de caracteres es: " + texto[0])
print("El último carácter de la cadena de caracteres es: " + texto[-1])
print("La palabra a extraer es: " + texto[-6:])
El primer carácter de la cadena de caracteres es: S
El último carácter de la cadena de caracteres es: n
La palabra a extraer es: Python

Al ser inmutables no se puede modificar una cadena de caracteres recurriendo a los índices.

try: 
    texto[0] = 1
except: 
    print("No es posible usar asignaciones por índice")
No es posible usar asignaciones por índice

Pese a lo anterior, los datos tipo str cuentan con un amplio número de métodos que facilitan todo tipo de operaciones de interés. Aquí listamos los más comunes:

Método

Descripción

capitalize()

Convierte la primera letra de una cadena de caracteres a mayúscula

count('abc')

Cuenta el número de veces que la cadena de caracteres 'abc' se encuentra dentro de una cadena de caracteres

center(num)

Alinea al centro una cadena de caracteres dentro de una cadena de caracteres de tamaño num compuesta de espacios

find('abc')

Retorna la posición donde se encuentra por primera vez la cadena de caracteres 'abc' dentro de una cadena de caracteres (si no encuentra la cadena retorna -1)

isalnum()

Indica si una cadena de caracteres está compuesta únicamente de caracteres alfanuméricos

isalpha()

Indica si una cadena de caracteres está compuesta únicamente de letras

isdigit()

Indica si una cadena de caracteres está compuesta únicamente de dígitos

isspace()

Indica si una cadena de caracteres está compuesta únicamente de espacios (’ ‘)

lower()

Convierte todas las letras de una cadena de caracteres a minúsculas

ljust(num)

Alinea al la izquierda una cadena de caracteres dentro de una cadena de caracteres de tamaño num compuesta de espacios

rfind(abc)

Retorna la posición donde se encuentra por última vez la cadena de caracteres 'abc' dentro de una cadena de caracteres (si no encuentra la cadena retorna -1)

rjust(num)

Alinea a la derecha una cadena de caracteres dentro de una cadena de caracteres de tamaño num compuesta de espacios

split('abc', num)

Separa una cadena de caracteres utilizando como separador las primeras num ocurrencias de la cadena de caracteres 'abc'

splitlines()

Retorna una lista con las línas de una cadena de caracteres

strip()

Remueve de una cadena de caracteres los espacios que contiene al inicio y al final

title()

Convierte todas las letras de una cadena de caracteres a mayúscula

upper()

Convierte todas las letras de una cadena de caracteres a mayúsculas

Ejemplo 2#

Usando la cadena de caracteres encontrada en la caja de código se requiere:

  • Reemplazar los númerales ("#") por espacios para que su lectura sea más fácil.

  • Eliminar todo lo escrito después del punto y coma (";")

  • Transformar a formato tipo oración (solo la primera palabra va con mayúscula).

texto2 = "Era#Necesario#Que#El#Hospital#Permaneciese#Abierto#Toda#La#Noche;#Hubo#Que#Establecer#Turnos."

Primero, reemplazamos los numerales por espacios. Para ello, utilizamos el método replace cuyos parámetros indican la cadena de caracteres a reemplazar y la cadena de caracteres que la va a reemplazar.

texto2 = texto2.replace('#',' ')
print(texto2)
Era Necesario Que El Hospital Permaneciese Abierto Toda La Noche; Hubo Que Establecer Turnos.

El método split separa una cadena de caracteres cada vez que encuentra la subcadena ingresada como parámetro y retorna una lista en la que se encuentran almacenados los fragmentos de la cadena de caracteres original. A continuación, veamos el resultado de aplicar el método split a la cadena texto2 ingresando como parámetro la subcadena ";".

print(texto2.split(';'))
['Era Necesario Que El Hospital Permaneciese Abierto Toda La Noche', ' Hubo Que Establecer Turnos.']

Para quedarnos con la información que nos interesa, ejecutamos una consulta sobre esta lista.

texto2 = texto2.split(';')[0]
print(texto2)
Era Necesario Que El Hospital Permaneciese Abierto Toda La Noche

Eliminamos las mayúsculas al comienzo de cada palabra utilizando el método lower.

texto2 = texto2.lower()
print(texto2)
era necesario que el hospital permaneciese abierto toda la noche

Por último, utilizamos el método capitalize para tener el formato tipo oración requerido.

texto2 = texto2.capitalize() + '.'
print(texto2)
Era necesario que el hospital permaneciese abierto toda la noche.

1.2. Cadenas de caracteres interpretadas como True o False#

En Python, aplicamos un condicional a una cadena de caracteres, lista o cualquier otra estructura de datos, para verificar si está vacía. El condicional retorna: False, si la estructura está vacía; True, de lo contrario. Esto será especialmente útil para identificar líneas vacías al leer archivos.

texto3 = ""
if texto3:
    print("La cadena de caracteres no esta vacía")
else:
    print("La cadena de caracteres está vacía")
La cadena de caracteres está vacía
texto4 = "Python"
if texto4:
    print("La cadena de caracteres no está vacía")
else:
    print("La cadena de caracteres está vacía")
La cadena de caracteres no está vacía

2. Importación de archivos de texto ".csv" y ".txt"#

Según el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE por sus siglas en Inglés), un archivo de texto, el cual es típicamente almacenado con extensión '.txt', es un documento estándar de texto organizado en cero o más líneas (IEEE, 2018). Las líneas no pueden contener un carácter Null y tampoco pueden exceder la constante de la extensión máxima de una línea (específicada en bytes). Generalmente, para marcar el final de una línea (EOL por sus siglas en Inglés) se usa la expresión "\n", aunque esta práctica varía entre sistemas operativos.

En Python, los archivos se pueden modificar como si fueran variables. Utilizamos propiedades similares a las que hemos visto, puesto que disponemos de métodos para realizar las operaciones que necesitemos. La palabra open está reservada en Python para una función integrada llamada open, la cuál recibe como parámetro indispensable un archivo. Esta función abre un archivo y retorna un Objeto Archivo (File Object). Según el tipo de archivo que se haya importado, este objeto se encontrará en alguna de las siguientes categorías: binario sin procesar, binario procesado o texto. Esta sería la sintaxis básica para importar un archivo:

f = open("Archivos/archivo.txt")

2.1. Parámetros de la función open#

Como estamos trabajando con archivos de texto, el objeto f será del tipo archivo de texto, y estará en capacidad de leer y escribir cadenas de caracteres. Antes de explicar los métodos que tendrá el objeto f, explicaremos los argumentos que ofrece la función open(), que son relevantes para el manejo de archivos de texto.

f = open(file, mode, encoding, newline) 
  • file: se refiere a la ruta en el directorio del archivo a abrir.

    • Ruta absoluta: siempre contiene el directorio raiz y la ruta completa que incluye cada uno de los subdirectorios que llevan al archivo. Ej. "C:/home/sally/statusReport"

    • Ruta relativa: para archivos que se encuentran en el directorio actual o subdirectorios del mismo, basta con declarar los subdirectorios que llevan al archivo solo a partir del directorio actual. Ej. "./sally/statusReport" se refiere al archivo a abrir. Podemos escribir el nombre del archivo si se encuentra dentro del directorio de trabajo, como hicimos en la línea de código anterior, o la ruta absoluta en el directorio desde la raiz del directorio.

  • mode: se refiere a las opciones para abrir el archivo, a continuación presentamos algunos valores que puede tomar el parámetro y la función que ejecuta. La opción por defecto es 'r'.

Código

Función

'r'

Abre el archivo para su lectura ubicando el cursor al inicio de este

'w'

Abre el archivo para su escritura o lo crea si no existe

'a'

Permite agregar más líneas al archivo sin editar las demás

'r+'

Abre el archivo para su lectura y escritura ubicando el cursor al inicio de este

  • encoding: hace referencia a la codificación de caracteres empleada para facilitar el procedimiento de lectura del archivo. Típicamente, las tres mas usadas son “UTF-8”, “ISO-8859-1” y “Windows-1251”, estas tienen algunas variaciones sobre las que puede investigar.

  • newline: hace referencia al caracter empleado para distinguir el final de una línea. El caracter por defecto es None.

Código

Descripción

'\n'

Utiliza únicamente la convención \n

'\r'

Utiliza únicamente la convención \r

'\r\n'

Utiliza únicamente la convención \r\n

'None'

Permite usar cualquiera de las anteriores convenciones

2.2. Métodos del Objeto Archivo#

Los métodos más utilizados del Objeto Archivo son los siguientes:

Método

Descripción

read(num)

Lee el archivo completo o el número num de caracteres especificado por parámetro

readline()

Lee la línea actual del archivo

readlines()

Lee todo el contenido del archivo y almacena sus líneas en una lista

write(str)

Escribe en el archivo la cadena de caracteres str ingresada por parámetro

close()

Cierra el archivo dando por terminada su edición y lectura

Otro método importante es el método seek, el cuál sirve para desplazar el cursor a cualquier parte del archivo. Este método tiene dos parámetros: uno obligatorio (num) y otro opcional (desp). A continuación los explicamos:

  • num: número de caracteres que deseamos desplazar el cursor.

  • desp: 0 (por defecto), desplaza el cursor num caracteres adelante con respecto al inicio del archivo; 1, desplaza el cursor num caracteres adelante con respecto a la posición en la que se encuentra actualmente el cursor; 2, desplaza el cursor num caracteres atrás con respecto al final del archivo.

Nota: los métodos de lectura en Python (read, readline, readlines) leen archivos de forma secuencial (línea por línea). Una vez leído el archivo, si volvemos a ejecutar alguno de estos métodos, este retorna una cadena de caracteres vacía. A continuación vemos un ejemplo de lectura de archivos.

Ejemplo 3#

En el archivo de texto “capitales.txt” encontramos las siguientes líneas:

"Capitales del mundo:"
""
"Nueva Delhi es la capital de India"
"Washington es la capital de Estados Unidos"
"Abuya es la capital de Nigeria"
"Buenos Aires es la capital de Argentina"
"Suva es la capital de Fiji"

Se nos pide lo siguiente:

  • Leer la primera línea del archivo.

  • Leer la segunda línea del archivo.

  • Leer el resto del archivo.

  • Leer nuevamente todo el archivo por líneas.

  • Cerrar el archivo.

Resolvamos la primera solicitud utilizando la función open.

f = open("Archivos/Capitales.txt", "r")

Para leer la primera línea utilizamos el método readline.

f.readline()
'Capitales del mundo:\n'

La instrucción anterior desplazó el cursor al inicio de la segunda línea. Por lo tanto, para leer la segunda línea utilizamos otra vez el método readline.

f.readline()
'\n'

Para leer el resto de las líneas utilizamos el método read.

f.read()
'Nueva Delhi es la capital de India\nWashington es la capital de Estados Unidos\nAbuya es la capital de Nigeria\nBuenos Aires es la capital de Argentina\nSuva es la capital de Fiji'

Para leer nuevamente el archivo, primero debemos desplazar el cursor al inicio. Utilizamos el método seek, estebleciendo en cero el valor de sus dos parámetros. Por defecto el valor del segundo parámetro es cero.

f.seek(0)
0

Ahora sí podemos leer nuevamente el archivo completo.

f.readlines()
['Capitales del mundo:\n',
 '\n',
 'Nueva Delhi es la capital de India\n',
 'Washington es la capital de Estados Unidos\n',
 'Abuya es la capital de Nigeria\n',
 'Buenos Aires es la capital de Argentina\n',
 'Suva es la capital de Fiji']

Finalmente, para cerrar el archivo utilizamos el método close.

f.close()

2.3. Atributos del Objeto Archivo#

Los atributos más utilizados del Objeto Archivo son los siguientes:

Atributo

Descripción

closed

Retorna True si el archivo ya está cerrado

encoding

Retorna el encoding elegido para leer el archivo

mode

Retorna el modo elegido para abrir el archivo

name

Retorna el nombre del archivo

2.4. Sintaxis de apertura y cierre automático de archivos#

Hasta el momento, hemos trabajado con los archivos de texto suministrando una instrucción de apertura del archivo y una instrucción de cierre. Con este proceder corremos el riesgo de olvidar cerrar el archivo, lo cuál se presta para confusiones, consume memoria, y bloquea el uso o apertura del archivo fuera de nuestro Notebook. Para evitar este riesgo, podemos utilizar la siguiente sintaxis:

with open("myfile.txt", mode, encoding, newline) as f:
    # Código a ejecutar con el archivo abierto: 
    # Instrucción_1
    # Instrucción_2

La sintaxis anterior abre el archivo, lo asigna a un Objeto Archivo (f), nos permite realizar operaciones y lo cierre de manera automática.

3. Archivos de textos delimitados#

Los archivo de texto se dividen en archivos de texto delimitados y archivos de texto no delimitados. Los primeros resultan más sencillos para trabajar pues, como su nombre lo indica, cada línea de un archivo de texto delimitado esta separada por un delimitador. Los archivos ".csv", por ejemplo, se encuentran delimitados por comas (",") o por punto y comas (";"), según convención. Otro delimitador muy común para separar los campos de texto es la tabulación "\t", la cual se usa regularmente en los archivos con formato ".txt".

Para trabajar con archivos de texto delimitados podemos utilizar los métodos de las cadenas de caracteres. En particular, una estrategía muy común es utilizar el método split para separar las línea del archivo. Este uso quedará ilustrado en el siguiente ejemplo.

Ejemplo 4#

Se creó un archivo “DiccionarioPaises.csv” con codificación “UTF-8” para almacenar en inglés y en español el nombre de los países del mundo. Se nos solicita que llevemos a cabo las siguientes tareas:

  • Identificar cuál es el delimitador del archivo.

  • Crear un diccionario inglés-español de los países.

Una buena práctica para resolver estos requerimientos es utilizar la sintaxis de apertura y cierre automático de archivos. Para identificar el delimitador del archivo procedemos a leer e imprimir su contenido.

# Abrimos el archivo para su lectura. 
with open("Archivos/DiccionarioPaises.csv", encoding = "utf-8-sig") as f:
    # Leemos e imprimimos el contenido del archivo.
    print(f.read())
País en español;País en inglés
Afganistán;Afghanistan
Albania;Albania
Alemania;Germany
Andorra;Andorra
Angola;Angola
Antigua y Barbuda;Antigua and Barbuda
Arabia Saudí;Saudi Arabia
Argelia;Algeria
Argentina;Argentina
Armenia;Armenia
Australia;Australia
Austria;Austria
Azerbaiyán;Azerbaijan
Bahrein;Bahrain
Bangladesh;Bangladesh
Barbados;Barbados
Bélgica;Belgium
Belice;Belize
Benín;Benin
Bermudas;Bermuda
Bielorrusia;Belarus
Birmania;Burma
Bolivia;Bolivia
Bosnia y Herzegovina;Bosnia and Herzegovina
Botswana;Botswana
Brasil;Brazil
Brunei;Brunei
Bulgaria;Bulgaria
Burkina Faso;Burkina Faso
Burundi;Burundi
Bután;Bhutan
Camboya;Cambodia
Camerún;Cameroon
Canadá;Canada
el Chad;Chad
Chile;Chile
China;China, Mainland
Chipre;Cyprus
Ciudad del Vaticano;Vatican City
Colombia;Colombia
el Congo;Congo
Corea del Norte;North Korea
Corea del Sur;Korea
Costa de Marfil;Ivory Coast
Costa Rica;Costa Rica
Croacia;Croatia
Cuba;Cuba
Dinamarca;Denmark
Dominica;Dominica
Ecuador;Ecuador
Egipto;Egypt
El Salvador;El Salvador
Emiratos Árabes Unidos (EAU);United Arab Emirates
Eritrea;Eritrea
Escocia;Scotland
Eslovaquia;Slovakia
Eslovenia;Slovenia
España;Spain
Estonia;Estonia
Etiopía;Ethiopia
Filipinas;Philippines
Finlandia;Finland
Fiyi;Fiji
Francia;France
Gabón;Gabon
Gales;Wales
Gambia;Gambia
Georgia;Georgia
Ghana;Ghana
Gran Bretaña;Great Britain
Granada;Grenada
Grecia;Greece
Groenlandia;Greenland
Guatemala;Guatemala
Guinea;Guinea
Guinea Ecuatorial;Equatorial Guinea
Guinea-Bisáu;Guinea-Bissau
Guyana;Guyana
Haití;Haiti
Honduras;Honduras
Hong kong;Hong Kong
Hungría;Hungary
La India;India
Indonesia;Indonesia
Inglaterra;England
Irán;Iran
Iraq;Iraq
Irlanda;Ireland
Irlanda del Norte;Northern Ireland
Islandia;Iceland
Islas Caimán;Cayman Islands
Islas de Cabo Verde;Cape Verde Islands
Israel;Israel
Italia;Italy
Jamaica;Jamaica
Japón;Japan
Jordania;Jordan
Kazajstán;Kazakhstan
Kenia;Kenya
Kirguistán;Kyrgystan
Kiribati;Kiribati
Kosovo;Kosovo
Kuwait;Kuwait
Laos;Laos
las Bahamas;The Bahamas
las Comoras;Comoros
las Islas Feroe;The Faroe Islands
las Islas Marshall;The Marshall Islands
las Islas Salomón;The Solomon Islands
las Seychelles;The Seychelles
Lesotho;Lesotho
Letonia;Latvia
Liberia;Liberia
Libia;Libya
Liechtenstein;Liechtenstein
Lituania;Lithuania
Estados Unidos de América (EEUU);The Unites States of America (USA)
Países Bajos;Netherlands
Luxemburgo;Luxembourg
Líbano;Lebanon
Macao;Macao
Macedonia;Macedonia
Madagascar;Madagascar
Malasia;Malaysia
Malawi;Malawi
Maldivas;The Maldives
Malta;Malta
Malí;Mali
Marruecos;Morocco
Mauricio;Mauritius
Mauritania;Mauritania
México;Mexico
Micronesia;Micronesia
Moldavia;Moldova
Mónaco;Monaco
Mongolia;Mongolia
Montenegro;Montenegro
Mozanbique;Mozambique
Namibia;Namibia
Nauru;Nauru
Nepal;Nepal
Nicaragua;Nicaragua
Nigeria;Nigeria
Noruega;Norway
Nueva Zelanda;New Zealand
Níger;Niger
Omán;Oman
Pakistán;Pakistan
Palau;Palau
Palestina;Palestine
Panamá;Panama
Papua Nueva Guinea;Papua New Guinea
Paraguay;Paraguay
Perú;Peru
Polonia;Poland
Portugal;Portugal
Puerto Rico;Puerto Rico
Qatar;Qatar
Reino Unido;United Kingdom
República Centroafricana;The Central African Republic
República Checa;The Czech Republic
República Democrática del Congo;The Democratic Republic of Congo
República Dominicana;The Dominican Republic
Ruanda;Rwanda
Rumanía;Romania
Rusia;Russia
Samoa;Samoa
San Cristóbal y Nieves;St Kitts and Nevis
San Marino;San Marino
San Vicente y las Granadinas;St Vincent and the Grenadines
Santa Lucía;St Lucia
Santo Tomé y Príncipe;São Tomé and Príncipe
Senegal;Senegal
Serbia;Serbia
Sierra Leona;Sierra Leone
Singapur;Singapore
Siria;Syria
Somalia;Somalia
Sri Lanka;Sri Lanka
Sudáfrica;South Africa
Sudán;Sudan
Suecia;Sweden
Suiza;Switzerland
Surinam;Suriname
Swazilandia;Swaziland
Tailandia;Thailand
Taiwán;Taiwan
Tanzania;Tanzania
Tayikistán;Tajikistan o Tadzhikstan
Timor Oriental;East Timor oder Timor-Leste
Togo;Togo
Tonga;Tonga
Trinidad y Tobago;Trinidad and Tobago
Túnez;Tunisia
Turkmenistán;Turkmenistan
Turquía;Turkey
Tuvalu;Tuvalu
el Tíbet;Tibet
Ucrania;Ukaraine
Uganda;Uganda
Uruguay;Uruguay
Uzbekistán;Uzbekistan
Vanuatu;Vanuatu
Venezuela;Venezuela
Vietnam;Vietnam
Yemen;Yemen
Yibuti;Djibouti
Zambia;Zambia
Zimbabue;Zimbabwe

Ahora, creemos el diccionario inglés-español de los países que nos fueron solicitados.

# Creamos un diccionario vacío
dicc_paises = {}

# Abrimos el archivo para su lectura. 
with open("Archivos/DiccionarioPaises.csv", encoding = 'utf-8-sig') as f: 
    # Leemos el archivo como una sola cadena de caracteres
    lineas = f.read()
    # Separamos su contenido por líneas
    lineas = lineas.splitlines()
    
    # Recorremos la lista de líneas sin incluir los nombres de las columnas: "País en español" y "País en inglés"
    for i in lineas[1:]: 
        # La llave y el valor de cada elemento del diccionario son el nombre del país en inglés y en español, respectivamente.
        dicc_paises[i.split(";")[1]] = i.split(";")[0]

# Veamos el valor de nuestro diccionario para la llave 'Germany'
dicc_paises['Germany']
'Alemania'

4. Archivos de textos no delimitados#

Los archivos de texto no delimitados no tienen un delimitador para distinguir los campos de texto. Sin embargo, suelen agrupar la información en campos de texto de ancho fijo. A continuación, se presenta una matriz de números con tres columnas de ancho fijo:

col1    col2    col3 
------  ------  ------
10000   500     60  
8500    3000    9
11000   2500    30
9000    2000    21

Los archivos de ancho fijo pueden estar alineados a la izquierda (como en el caso anterior) o la derecha. Si están alineados a la izquierda, la distancia entre el primer carácter de un campo y el primer carácter del siguiente campo es siempre la misma, entre cada par de campos. De manera analóga, si estan alineados a la derecha, la distancia entre cada par de últimos carácteres es fija. A continuación un ejemplo de alineación a la derecha:

col1    col2    col3   
------  ------  ------  
 10000     500      60  
  8500    3000       9  
 11000    2500      30
  9000    2000      21

Puesto que la característica principal de los archivos de ancho fijo es que hay espacios entre las columnas, generalmente utilizamos el método split para separarlos, ingresando como parámetro una cadena vacía. También es posible utilizar una cadena de guíones ("----") para identificar donde empieza cada columna. Los ejemplos a continuación ilustran estos casos.

Ejemplo 5#

El archivo "matriz.txt" contiene la matriz de tres columnas definida en la celda anterior. Se nos solicita guardar cada columna de la matriz en una lista independiente y mostrar las tres en una sola tupla.

En la celda de código procedemos de la siguiente manera:

# Creamos las tres listas vacías
lista_col1 = []
lista_col2 = []
lista_col3 = []

# Abrirmos el archivo para su lectura 
with open("Archivos/Matriz.txt") as f:
    # Utilizamos el método readlines de los Objetos Archivo para guardar en una lista las líneas del archivo
    lineas_matriz = f.readlines()
    
    # Recorremos cada línea de la lista de líneas de archivo iniciando en la tercera línea 
    for i in lineas_matriz[2:]: 
        # Separamos cada línea en sus tres columnas
        lista_lineas = i.split()
        # Añadimos el valor que toma el registro actual a la lista correspondiente a cada columna.
        lista_col1.append(lista_lineas[0])
        lista_col2.append(lista_lineas[1])
        lista_col3.append(lista_lineas[2])

# Imprimimos las listas como una sola tupla  
lista_col1, lista_col2, lista_col3
(['10000', '8500', '11000', '9000'],
 ['500', '3000', '2500', '2000'],
 ['60', '9', '30', '21'])

Ejemplo 6#

Requerimos analizar la distribución del monto de títulos del tesoro americano de los Estados Unidos que se encuentra en cuentas extranjeras. El archivo "mfh.txt" (Major foreign holders) recopila esta información para los países donde se concentra el mayor monto de estos títulos. En relación con este archivo se nos solicita inspeccionar el archivo, guardar en una lista la información de los tenedores de bonos en el tiempo, y eliminar el encabezado, las líneas vacías y el gran total del monto de los títulos del tesoro americano.

Iniciamos con la impresión del archivo de texto para inspeccionarlo:

with open("Archivos/mfh.txt", "r") as mfh: 
    lista_mfh = mfh.read()
    print(lista_mfh)
                                             MAJOR FOREIGN HOLDERS OF TREASURY SECURITIES
                                                       (in billions of dollars)
                                                     HOLDINGS 1/ AT END OF PERIOD


                                  Sep     Aug     Jul     Jun     May     Apr     Mar     Feb     Jan     Dec     Nov     Oct     Sep
Country                           2020    2020    2020    2020    2020    2020    2020    2020    2020    2019    2019    2019    2019
                                ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------

Japan                           1276.2  1278.4  1293.0  1261.5  1260.4  1266.5  1272.6  1268.6  1211.8  1155.2  1160.6  1168.5  1146.2
China, Mainland                 1061.7  1068.0  1073.4  1074.4  1083.7  1072.8  1081.6  1092.3  1078.6  1069.9  1089.1  1101.5  1102.4
United Kingdom                   428.9   419.9   424.7   445.6   445.8   429.2   469.7   477.1   450.3   392.1   400.5   412.7   412.7
Ireland                          315.8   335.3   330.8   330.3   324.2   301.3   271.6   282.8   271.7   281.9   289.7   285.4   274.1
Brazil                           265.1   265.0   265.7   264.1   264.4   259.5   264.4   285.9   283.3   281.8   293.3   298.5   303.0
Luxembourg                       262.5   268.8   264.7   267.6   262.7   265.5   246.1   260.8   255.2   254.6   261.9   263.0   252.3
Switzerland                      255.3   253.1   250.7   247.4   243.1   241.3   244.6   243.7   238.1   237.5   233.4   233.2   231.1
Hong Kong                        245.5   250.9   267.1   266.4   269.0   259.4   256.0   268.4   253.0   249.7   249.7   243.6   242.5
Cayman Islands                   231.6   228.9   222.3   224.0   216.7   213.0   209.4   228.2   225.1   238.2   234.2   236.8   250.9
Belgium                          218.1   215.0   211.9   218.7   212.1   210.2   206.1   218.0   206.5   207.4   202.4   205.6   215.5
Taiwan                           213.5   212.0   209.7   204.6   199.2   201.7   205.0   201.9   199.2   193.1   188.6   191.2   189.0
India                            213.5   196.5   194.6   182.7   169.9   157.4   156.5   177.5   164.3   162.0   159.2   161.4   160.7
Singapore                        159.0   160.3   158.6   150.5   142.1   146.1   151.5   165.4   160.7   147.9   150.6   138.8   141.8
France                           135.4   133.6   130.3   144.2   130.5   137.7   156.0   147.6   134.0   127.7   123.0   133.4   132.2
Saudi Arabia                     131.2   130.0   124.6   124.9   123.5   125.3   159.1   184.4   182.9   179.8   179.7   178.9   181.5
Canada                           128.0   131.0   133.9   127.5   129.9   136.3   131.5   148.3   157.9   143.3   155.2   157.1   153.4
Korea                            123.2   122.7   123.1   122.7   117.3   120.0   110.8   116.1   121.1   121.9   117.2   117.1   118.5
Norway                            91.3    91.4    90.6    89.5    87.6    93.2    98.0   103.3    97.7    90.1    96.0   100.3    99.2
Thailand                          83.2    85.7    87.9    85.5    85.8    80.5    81.8    91.3    96.0    90.5    91.2    95.2    93.5
Germany                           74.8    78.9    78.3    79.5    80.6    77.7    77.3    86.0    83.7    78.3    79.9    84.0    84.9
Bermuda                           73.6    70.9    66.6    66.8    63.9    65.5    64.2    65.9    64.8    71.3    68.2    65.4    69.6
Netherlands                       69.2    68.5    71.2    69.4    67.9    66.2    69.1    70.9    67.7    65.1    62.2    61.7    62.1
Israel                            51.5    47.7    48.4    47.6    46.8    43.2    41.1    45.1    45.6    43.1    45.6    45.4    46.0
Mexico                            49.2    49.5    47.6    47.0    47.4    45.4    40.9    47.5    45.8    45.3    49.1    49.1    51.5
Philippines                       46.7    47.6    43.8    44.2    42.7    42.7    43.1    41.8    40.4    34.8    37.4    34.6    34.0
Kuwait                            46.6    46.4    47.9    44.9    43.6    44.5    40.1    43.6    41.9    43.3    43.0    43.8    44.1
Poland                            44.1    43.8    42.5    39.7    38.0    34.4    35.6    38.8    37.7    38.8    38.5    35.7    36.8
Italy                             44.0    43.5    42.6    42.4    41.4    41.5    44.8    46.8    44.6    45.3    45.7    47.1    47.2
Spain                             41.3    41.3    41.9    44.0    47.3    44.0    43.8    46.2    43.9    50.4    44.4    45.6    43.1
Australia                         38.3    41.6    42.8    41.9    43.5    44.8    46.3    43.7    45.1    41.8    44.6    45.4    39.6
Sweden                            38.2    38.3    40.0    39.1    37.1    36.5    39.5    45.4    45.0    48.7    49.5    46.9    47.3
United Arab Emirates              33.1    36.6    29.5    26.1    27.9    26.3    28.0    37.3    39.8    40.7    39.9    38.4    37.3
Vietnam                           30.4    30.1    29.9    30.3    30.3    29.6    30.7    31.0    30.3    30.5    29.9    29.2    28.8
All Other                        551.1   551.8   566.1   551.5   551.8   544.1   532.4   574.8   563.4   542.3   548.7   551.8   550.7
Grand Total                     7071.0  7083.2  7097.0  7046.6  6978.0  6903.4  6949.5  7226.2  7027.3  6844.2  6902.1  6946.4  6923.5

Of which:
 For. Official                  4199.5  4200.0  4191.9  4148.0  4105.9  4047.4  4117.9  4264.9  4169.9  4076.9  4101.2  4122.9  4150.9
  Treasury Bills                 371.5   385.0   393.6   382.5   355.7   331.0   283.2   306.1   294.8   268.6   273.6   288.1   290.8
  T-Bonds & Notes               3828.1  3815.0  3798.4  3765.5  3750.2  3716.4  3834.6  3958.8  3875.1  3808.3  3827.6  3834.8  3860.1

Department of the Treasury/Federal Reserve Board
November 17, 2020

 1/  The data in this table are collected primarily from U.S.-based custodians and broker-dealers. Since U.S. securities held in
     overseas custody accounts may not be attributed to the actual owners, the data may not provide a precise accounting of
     individual country ownership of Treasury securities
     (see TIC FAQ #7 at: http://www.treasury.gov/resource-center/data-chart-center/tic/Pages/ticfaq1.aspx).

     Estimated foreign holdings of U.S. Treasury marketable and non-marketable bills, bonds, and notes reported under the Treasury
     International Capital (TIC) reporting system are based on monthly data on holdings of Treasury bonds and notes
     as reported on TIC Form SLT, Aggregate Holdings of Long-Term Securities by U.S. and Foreign Residents
     and on TIC Form BL2, Report of Customers' U.S. Dollar Liabilities to Foreign Residents.

Para extraer la información necesitamos seleccionar dos palabras o caracteres que nos indiquen donde inicia y donde termina la tabla. En este caso, podemos usar la palabra ‘Period’ para marcar el inicio, dado que esta es la última palabra del encabezado antes de iniciar la tabla. Por su parte, podemos usar la palabra ‘Grand’ para marcar el final, dado que la instrucción nos indica que hasta esa línea llega la información de interés.

En la celda de código procedemos de la siguiente manera:

with open("Archivos/mfh.txt", "r") as mfh:  
    # Leemos el archivo y lo almacenamos en una sola cadena de caracteres
    mfh = mfh.read()
    # Seleccionamos la cadena de caracteres que se encuentra entre la palabra 'Period' y la palabra 'Grand'
    mfh = mfh.split('PERIOD')[1].split('Grand')[0]
    # Declaramos una lista con las líneas de nuestra cadena de caracteres
    lista_mfh = mfh.splitlines()
    # Nos quedamos únicamente con las líneas no vacías
    lista_mfh = [x for x in lista_mfh if x]

lista_mfh
['                                  Sep     Aug     Jul     Jun     May     Apr     Mar     Feb     Jan     Dec     Nov     Oct     Sep',
 'Country                           2020    2020    2020    2020    2020    2020    2020    2020    2020    2019    2019    2019    2019',
 '                                ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------',
 'Japan                           1276.2  1278.4  1293.0  1261.5  1260.4  1266.5  1272.6  1268.6  1211.8  1155.2  1160.6  1168.5  1146.2',
 'China, Mainland                 1061.7  1068.0  1073.4  1074.4  1083.7  1072.8  1081.6  1092.3  1078.6  1069.9  1089.1  1101.5  1102.4',
 'United Kingdom                   428.9   419.9   424.7   445.6   445.8   429.2   469.7   477.1   450.3   392.1   400.5   412.7   412.7',
 'Ireland                          315.8   335.3   330.8   330.3   324.2   301.3   271.6   282.8   271.7   281.9   289.7   285.4   274.1',
 'Brazil                           265.1   265.0   265.7   264.1   264.4   259.5   264.4   285.9   283.3   281.8   293.3   298.5   303.0',
 'Luxembourg                       262.5   268.8   264.7   267.6   262.7   265.5   246.1   260.8   255.2   254.6   261.9   263.0   252.3',
 'Switzerland                      255.3   253.1   250.7   247.4   243.1   241.3   244.6   243.7   238.1   237.5   233.4   233.2   231.1',
 'Hong Kong                        245.5   250.9   267.1   266.4   269.0   259.4   256.0   268.4   253.0   249.7   249.7   243.6   242.5',
 'Cayman Islands                   231.6   228.9   222.3   224.0   216.7   213.0   209.4   228.2   225.1   238.2   234.2   236.8   250.9',
 'Belgium                          218.1   215.0   211.9   218.7   212.1   210.2   206.1   218.0   206.5   207.4   202.4   205.6   215.5',
 'Taiwan                           213.5   212.0   209.7   204.6   199.2   201.7   205.0   201.9   199.2   193.1   188.6   191.2   189.0',
 'India                            213.5   196.5   194.6   182.7   169.9   157.4   156.5   177.5   164.3   162.0   159.2   161.4   160.7',
 'Singapore                        159.0   160.3   158.6   150.5   142.1   146.1   151.5   165.4   160.7   147.9   150.6   138.8   141.8',
 'France                           135.4   133.6   130.3   144.2   130.5   137.7   156.0   147.6   134.0   127.7   123.0   133.4   132.2',
 'Saudi Arabia                     131.2   130.0   124.6   124.9   123.5   125.3   159.1   184.4   182.9   179.8   179.7   178.9   181.5',
 'Canada                           128.0   131.0   133.9   127.5   129.9   136.3   131.5   148.3   157.9   143.3   155.2   157.1   153.4',
 'Korea                            123.2   122.7   123.1   122.7   117.3   120.0   110.8   116.1   121.1   121.9   117.2   117.1   118.5',
 'Norway                            91.3    91.4    90.6    89.5    87.6    93.2    98.0   103.3    97.7    90.1    96.0   100.3    99.2',
 'Thailand                          83.2    85.7    87.9    85.5    85.8    80.5    81.8    91.3    96.0    90.5    91.2    95.2    93.5',
 'Germany                           74.8    78.9    78.3    79.5    80.6    77.7    77.3    86.0    83.7    78.3    79.9    84.0    84.9',
 'Bermuda                           73.6    70.9    66.6    66.8    63.9    65.5    64.2    65.9    64.8    71.3    68.2    65.4    69.6',
 'Netherlands                       69.2    68.5    71.2    69.4    67.9    66.2    69.1    70.9    67.7    65.1    62.2    61.7    62.1',
 'Israel                            51.5    47.7    48.4    47.6    46.8    43.2    41.1    45.1    45.6    43.1    45.6    45.4    46.0',
 'Mexico                            49.2    49.5    47.6    47.0    47.4    45.4    40.9    47.5    45.8    45.3    49.1    49.1    51.5',
 'Philippines                       46.7    47.6    43.8    44.2    42.7    42.7    43.1    41.8    40.4    34.8    37.4    34.6    34.0',
 'Kuwait                            46.6    46.4    47.9    44.9    43.6    44.5    40.1    43.6    41.9    43.3    43.0    43.8    44.1',
 'Poland                            44.1    43.8    42.5    39.7    38.0    34.4    35.6    38.8    37.7    38.8    38.5    35.7    36.8',
 'Italy                             44.0    43.5    42.6    42.4    41.4    41.5    44.8    46.8    44.6    45.3    45.7    47.1    47.2',
 'Spain                             41.3    41.3    41.9    44.0    47.3    44.0    43.8    46.2    43.9    50.4    44.4    45.6    43.1',
 'Australia                         38.3    41.6    42.8    41.9    43.5    44.8    46.3    43.7    45.1    41.8    44.6    45.4    39.6',
 'Sweden                            38.2    38.3    40.0    39.1    37.1    36.5    39.5    45.4    45.0    48.7    49.5    46.9    47.3',
 'United Arab Emirates              33.1    36.6    29.5    26.1    27.9    26.3    28.0    37.3    39.8    40.7    39.9    38.4    37.3',
 'Vietnam                           30.4    30.1    29.9    30.3    30.3    29.6    30.7    31.0    30.3    30.5    29.9    29.2    28.8',
 'All Other                        551.1   551.8   566.1   551.5   551.8   544.1   532.4   574.8   563.4   542.3   548.7   551.8   550.7']

Ejemplo 7#

Ahora se nos solicita que traduzcamos del Inglés al Español el nombre de los países y de los meses incluidos en la lista_mfh que recién creamos. Para traducir los países podemos usar el diccionario dicc_paises creado en el Ejemplo 4, mientras que para traducir los meses utilizaremos el diccionario dicc_meses declarado en la siguiente celda.

dicc_meses = {'Jan':'ENE', 'Feb': 'FEB', 'Mar':'MAR', 'Apr':'ABR', 'May':'MAY' ,'Jun': 'JUN', 'Jul':'JUL',
              'Aug': 'AGO', 'Sep': 'SEP', 'Oct':'OCT', 'Nov':'NOV', 'Dec':'DIC'}

Para resolver este requerimiento debemos saber en que posición se ubica cada columna de números. A continuación encontramos dichas posiciones.

# Declaramos las siguientes variables: 
# Lista vacía para almacenar las posiciones de inicio de cada columna de números.
lista_inicio_cols = []
# Lista vacía para almacenar la última posición de cada columna de números. 
lista_fin_cols = []
# Cadena de caracteres que almacena la fila de guíones contenida en el archivo.
fila_guiones = lista_mfh[2]
# Variable de tipo entero para marcar el inicio de la busqueda a partir de cada columna. 
inicio_columna = 0
# Variable de tipo lógica para indicar si ya llegamos al final de la lista.
booleano = True

# Iteramos mientras el booleano se mantenga igual a `True`. 
while(booleano):
    # Declaramos el inicio de una nueva columna encontrando el siguiente guión.
    pos_inicio = inicio_columna + fila_guiones[inicio_columna:].find('-')  
    # Declaramos el ancho de la columna encontrando el siguiente espacio vacío.  
    ancho_columna = fila_guiones[pos_inicio:].find(' ')
    
    # Si encuentra dicho espacio
    if(ancho_columna != -1):
        # Almacenamos la posición de inicio de la columna.
        lista_inicio_cols.append(pos_inicio)
        # Declaramos la posición final de la columna.
        pos_final = pos_inicio + ancho_columna 
        # Almacenamos la posición final de la columna.
        lista_fin_cols.append(pos_final) 
        # Actualizamos el inicio de la columna para la siguiente iteración.
        inicio_columna = pos_final
    
    #Si no se pudo encontrar mas espacios no se se sigue iterando ya que no hay mas columnas.    
    else:
        booleano = False

Traduzcamos los meses utlizando el diccionario dicc_meses.

# Consultar los meses y años a partir del archivo
meses = lista_mfh[0]
anhos = lista_mfh[1] 

# Recorremos las llaves de los diccionarios para reemaplazar los meses en inglés por los meses en español
for j in dicc_meses.keys(): 
    meses = meses.replace(j, dicc_meses[j])

meses
'                                  SEP     AGO     JUL     JUN     MAY     ABR     MAR     FEB     ENE     DIC     NOV     OCT     SEP'

Al reemplazar una cadena de caracteres que se encuentra en inglés por una cadena de caracteres que contiene su traducción al español, debemos tener en cuenta que estas dos no necesariamente tienen el mismo tamaño. Por ejemplo, si reemplazamos la cadena de caracteres "Country" (tamaño = 7) por la cadena de caracteres "Pais" (tamaño = 4), todos los elementos de la fila se moverían tres caracteres a la izquierda, alterando el formato de ancho de columna fijo.

Una opción que tenemos para evitar alterar el formato es contabilizar el número de caracteres que hay desde el inicio de la línea hasta el inicio de la siguiente columna (lista_inicio_cols[0]). Utilizamos el método ljust para crear una cadena de caracteres de dicho tamaño compuesta únicamente de espacios y escribimos la traducción dentro de dicha cadena según la alineación del archivo original (en este caso a la izquierda). Posteriormente, concatenamos la cadena resultante con el resto de la línea.

anhos = "Pais".ljust(lista_inicio_cols[0]) + anhos[lista_inicio_cols[0]:]
anhos
'Pais                              2020    2020    2020    2020    2020    2020    2020    2020    2020    2019    2019    2019    2019'

Traducimos y reemplazamos los nombres de países siguiendo lógica anterior.

# Creamos una lista vacía para almacenar las líneas en español
traducidos = []
# Almacenamos en una variable la posición en la que inicia la primera columna de números
ancho_col = lista_inicio_cols[0]

# Recorremos las líneas desde la cuarta hasta la penúltima
for linea in lista_mfh[3:-1]: 
    # Usamos un rebanado y el método strip para extraer el país de la línea
    pais_ing = linea[:ancho_col].strip(' ')
    # Lo traducimos
    pais_esp = dicc_paises[pais_ing]
    # Agregamos a nuestra lista de traducidos la línea completa  
    traducidos.append(pais_esp.ljust(ancho_col) + linea[ancho_col:])

# Traducimos la última línea
traducidos.append("Otros".ljust(ancho_col) + lista_mfh[-1][ancho_col:]) 
traducidos
['Japón                           1276.2  1278.4  1293.0  1261.5  1260.4  1266.5  1272.6  1268.6  1211.8  1155.2  1160.6  1168.5  1146.2',
 'China                           1061.7  1068.0  1073.4  1074.4  1083.7  1072.8  1081.6  1092.3  1078.6  1069.9  1089.1  1101.5  1102.4',
 'Reino Unido                      428.9   419.9   424.7   445.6   445.8   429.2   469.7   477.1   450.3   392.1   400.5   412.7   412.7',
 'Irlanda                          315.8   335.3   330.8   330.3   324.2   301.3   271.6   282.8   271.7   281.9   289.7   285.4   274.1',
 'Brasil                           265.1   265.0   265.7   264.1   264.4   259.5   264.4   285.9   283.3   281.8   293.3   298.5   303.0',
 'Luxemburgo                       262.5   268.8   264.7   267.6   262.7   265.5   246.1   260.8   255.2   254.6   261.9   263.0   252.3',
 'Suiza                            255.3   253.1   250.7   247.4   243.1   241.3   244.6   243.7   238.1   237.5   233.4   233.2   231.1',
 'Hong kong                        245.5   250.9   267.1   266.4   269.0   259.4   256.0   268.4   253.0   249.7   249.7   243.6   242.5',
 'Islas Caimán                     231.6   228.9   222.3   224.0   216.7   213.0   209.4   228.2   225.1   238.2   234.2   236.8   250.9',
 'Bélgica                          218.1   215.0   211.9   218.7   212.1   210.2   206.1   218.0   206.5   207.4   202.4   205.6   215.5',
 'Taiwán                           213.5   212.0   209.7   204.6   199.2   201.7   205.0   201.9   199.2   193.1   188.6   191.2   189.0',
 'La India                         213.5   196.5   194.6   182.7   169.9   157.4   156.5   177.5   164.3   162.0   159.2   161.4   160.7',
 'Singapur                         159.0   160.3   158.6   150.5   142.1   146.1   151.5   165.4   160.7   147.9   150.6   138.8   141.8',
 'Francia                          135.4   133.6   130.3   144.2   130.5   137.7   156.0   147.6   134.0   127.7   123.0   133.4   132.2',
 'Arabia Saudí                     131.2   130.0   124.6   124.9   123.5   125.3   159.1   184.4   182.9   179.8   179.7   178.9   181.5',
 'Canadá                           128.0   131.0   133.9   127.5   129.9   136.3   131.5   148.3   157.9   143.3   155.2   157.1   153.4',
 'Corea del Sur                    123.2   122.7   123.1   122.7   117.3   120.0   110.8   116.1   121.1   121.9   117.2   117.1   118.5',
 'Noruega                           91.3    91.4    90.6    89.5    87.6    93.2    98.0   103.3    97.7    90.1    96.0   100.3    99.2',
 'Tailandia                         83.2    85.7    87.9    85.5    85.8    80.5    81.8    91.3    96.0    90.5    91.2    95.2    93.5',
 'Alemania                          74.8    78.9    78.3    79.5    80.6    77.7    77.3    86.0    83.7    78.3    79.9    84.0    84.9',
 'Bermudas                          73.6    70.9    66.6    66.8    63.9    65.5    64.2    65.9    64.8    71.3    68.2    65.4    69.6',
 'Países Bajos                      69.2    68.5    71.2    69.4    67.9    66.2    69.1    70.9    67.7    65.1    62.2    61.7    62.1',
 'Israel                            51.5    47.7    48.4    47.6    46.8    43.2    41.1    45.1    45.6    43.1    45.6    45.4    46.0',
 'México                            49.2    49.5    47.6    47.0    47.4    45.4    40.9    47.5    45.8    45.3    49.1    49.1    51.5',
 'Filipinas                         46.7    47.6    43.8    44.2    42.7    42.7    43.1    41.8    40.4    34.8    37.4    34.6    34.0',
 'Kuwait                            46.6    46.4    47.9    44.9    43.6    44.5    40.1    43.6    41.9    43.3    43.0    43.8    44.1',
 'Polonia                           44.1    43.8    42.5    39.7    38.0    34.4    35.6    38.8    37.7    38.8    38.5    35.7    36.8',
 'Italia                            44.0    43.5    42.6    42.4    41.4    41.5    44.8    46.8    44.6    45.3    45.7    47.1    47.2',
 'España                            41.3    41.3    41.9    44.0    47.3    44.0    43.8    46.2    43.9    50.4    44.4    45.6    43.1',
 'Australia                         38.3    41.6    42.8    41.9    43.5    44.8    46.3    43.7    45.1    41.8    44.6    45.4    39.6',
 'Suecia                            38.2    38.3    40.0    39.1    37.1    36.5    39.5    45.4    45.0    48.7    49.5    46.9    47.3',
 'Emiratos Árabes Unidos (EAU)      33.1    36.6    29.5    26.1    27.9    26.3    28.0    37.3    39.8    40.7    39.9    38.4    37.3',
 'Vietnam                           30.4    30.1    29.9    30.3    30.3    29.6    30.7    31.0    30.3    30.5    29.9    29.2    28.8',
 'Otros                            551.1   551.8   566.1   551.5   551.8   544.1   532.4   574.8   563.4   542.3   548.7   551.8   550.7']

Ejemplo 8#

Requerimos imprimir la tabla traducida en un archivo llamado "tft.txt" (Tenedores Fóraneos de Tesoros), incluyendo encabezados y pies de tablas.

# Abrimos el archivo paras su escritura
with open("Archivos/tft.txt", "w", encoding = "UTF-8") as tft: 
    # Escribimos el encabezado centrado
    tft.write("TENEDORES FORÁNEOS DE BONOS DEL TESORO AMERICANO".center(len(fila_guiones)) + "\n" + "\n")
    # Escribimos los títulos de las columnas 
    tft.write(meses + "\n")
    tft.write(anhos + "\n")
    tft.write(fila_guiones + "\n" + "\n")
    # Escribimos las líneas correspondientes a la información de los países
    
    for i in traducidos: 
        tft.write(i + "\n")
    
    # Escribimos el pie de tabla alineado a la derecha
    tft.write("\n" + "Cifras en Millones de Dólares al cierre del periodo".rjust(len(fila_guiones)))

Referencias#

The Java Tutorials (1995). What Is a Path? (And Other File System Facts). Recuperado el 17 de agosto de 2021. https://docs.oracle.com/javase/tutorial/essential/io/path.html

Biblioteca Estándar de Python (2020). Built in Functions. Recuperado el 8 de mayo de 2020. https://docs.python.org/es/3/library/functions.html#open

IEEE Std, The Open Group Technical Standard Base Specifications (2018). The open group base specifications issue 7. https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403

File Handling in Python (2020). OverIQ. Recuperado el 16 de noviembre de 2020 de: https://owl.purdue.edu/owl/research_and_citation/apa_style/apa_formatting_and_style_guide/reference_list_electronic_sources.html

RAE(2020). Punto y coma. Recuperado el 17 de noviembre de 2020 de: https://www.rae.es/dpd/punto y coma

Departamento del Tesoro Americano (2020). Principales tenedores foráneos de títulos del tesoro [Base de Datos]. Recuperado el 15 de septiembre de 2020 de : https://ticdata.treasury.gov/Publish/mfh.txt.

Créditos#

Autores: Jorge Esteban Camargo Forero, Alejandro Mantilla Redondo, Diego Alejandro Cely Gómez

Fecha última actualización: 12/07/2022