Show 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 |
---|---|
|
Convierte la primera letra de una cadena de caracteres a mayúscula |
|
Cuenta el número de veces que la cadena de caracteres |
|
Alinea al centro una cadena de caracteres dentro de una cadena de caracteres de tamaño |
|
Retorna la posición donde se encuentra por primera vez la cadena de caracteres |
|
Indica si una cadena de caracteres está compuesta únicamente de caracteres alfanuméricos |
|
Indica si una cadena de caracteres está compuesta únicamente de letras |
|
Indica si una cadena de caracteres está compuesta únicamente de dígitos |
|
Indica si una cadena de caracteres está compuesta únicamente de espacios (’ ‘) |
|
Convierte todas las letras de una cadena de caracteres a minúsculas |
|
Alinea al la izquierda una cadena de caracteres dentro de una cadena de caracteres de tamaño |
|
Retorna la posición donde se encuentra por última vez la cadena de caracteres |
|
Alinea a la derecha una cadena de caracteres dentro de una cadena de caracteres de tamaño |
|
Separa una cadena de caracteres utilizando como separador las primeras |
|
Retorna una lista con las línas de una cadena de caracteres |
|
Remueve de una cadena de caracteres los espacios que contiene al inicio y al final |
|
Convierte todas las letras de una cadena de caracteres a mayúscula |
|
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 |
---|---|
|
Abre el archivo para su lectura ubicando el cursor al inicio de este |
|
Abre el archivo para su escritura o lo crea si no existe |
|
Permite agregar más líneas al archivo sin editar las demás |
|
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 |
---|---|
|
Utiliza únicamente la convención |
|
Utiliza únicamente la convención |
|
Utiliza únicamente la convención |
|
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 |
---|---|
|
Lee el archivo completo o el número |
|
Lee la línea actual del archivo |
|
Lee todo el contenido del archivo y almacena sus líneas en una lista |
|
Escribe en el archivo la cadena de caracteres |
|
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 cursornum
caracteres adelante con respecto a la posición en la que se encuentra actualmente el cursor; 2, desplaza el cursornum
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 |
---|---|
|
Retorna |
|
Retorna el encoding elegido para leer el archivo |
|
Retorna el modo elegido para abrir el archivo |
|
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