5  Sistema de ficheros

Autor/a

Iraitz Montalbán

Como en todo lenguaje de programación, deberemos gestionar la lectura y escritura de ficheros. El sistema de ficheros lo gestiona el sistema operativo de nuestra máquina con lo que se trata más bien de interactuar con este al menos de cara a conocer por ejemplo, dónde estamos ubicados.

dirname(@__FILE__)
"/home/iraitz/Documentos/Projects/ciencia-datos-julia/parts/firststeps"

Podemos crear carpetas de forma programática pero en la mayoría de casos se tratará de leer y escribir ficheros en rutas concretas. Para ello nos será útil la función joinpath que nos ayuda a conformar rutas tal y como el sistema de ficheros requiere.

root = dirname(@__FILE__)
joinpath(root, "ejemplo.txt")
"/home/iraitz/Documentos/Projects/ciencia-datos-julia/parts/firststeps/ejemplo.txt"

Y como vimos anteriormente, usar la función readlines() para leer su contenido.

fichero = joinpath(root, "ejemplo.txt")
readline(fichero)
"Hola desde un fichero!"

Imaginemos por tanto que queremos descargarnos un CSV (Comma Separated Value) con información sobre los pasajeros del Titanic

using Downloads

fichero_url = "https://raw.githubusercontent.com/datasciencedojo/datasets/refs/heads/master/titanic.csv"
fichero = Downloads.download(fichero_url)
readlines(fichero)[1:20]
20-element Vector{String}:
 "PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked"
 "1,0,3,\"Braund, Mr. Owen Harris\",male,22,1,0,A/5 21171,7.25,,S"
 "2,1,1,\"Cumings, Mrs. John Bradley (Florence Briggs Thayer)\",female,38,1,0,PC 17599,71.2833,C85,C"
 "3,1,3,\"Heikkinen, Miss. Laina\",female,26,0,0,STON/O2. 3101282,7.925,,S"
 "4,1,1,\"Futrelle, Mrs. Jacques Heath (Lily May Peel)\",female,35,1,0,113803,53.1,C123,S"
 "5,0,3,\"Allen, Mr. William Henry\",male,35,0,0,373450,8.05,,S"
 "6,0,3,\"Moran, Mr. James\",male,,0,0,330877,8.4583,,Q"
 "7,0,1,\"McCarthy, Mr. Timothy J\",male,54,0,0,17463,51.8625,E46,S"
 "8,0,3,\"Palsson, Master. Gosta Leonard\",male,2,3,1,349909,21.075,,S"
 "9,1,3,\"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)\",female,27,0,2,347742,11.1333,,S"
 "10,1,2,\"Nasser, Mrs. Nicholas (Adele Achem)\",female,14,1,0,237736,30.0708,,C"
 "11,1,3,\"Sandstrom, Miss. Marguerite Rut\",female,4,1,1,PP 9549,16.7,G6,S"
 "12,1,1,\"Bonnell, Miss. Elizabeth\",female,58,0,0,113783,26.55,C103,S"
 "13,0,3,\"Saundercock, Mr. William Henry\",male,20,0,0,A/5. 2151,8.05,,S"
 "14,0,3,\"Andersson, Mr. Anders Johan\",male,39,1,5,347082,31.275,,S"
 "15,0,3,\"Vestrom, Miss. Hulda Amanda Adolfina\",female,14,0,0,350406,7.8542,,S"
 "16,1,2,\"Hewlett, Mrs. (Mary D Kingcome) \",female,55,0,0,248706,16,,S"
 "17,0,3,\"Rice, Master. Eugene\",male,2,4,1,382652,29.125,,Q"
 "18,1,2,\"Williams, Mr. Charles Eugene\",male,,0,0,244373,13,,S"
 "19,0,3,\"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)\",female,31,1,0,345763,18,,S"

Si queremos conservar el fichero para más adelante podemos recurrir a la función write() y guardarlo donde nosotros queramos.

destino = joinpath(mktempdir(), "titanic.csv")
write(destino, read(fichero))
60302
Nota

Guardamos en un directorio temporal a propósito: construir el libro no debería modificar ficheros ya versionados. En el repositorio el conjunto ya está en data/titanic.csv, de modo que los capítulos siguientes funcionan aunque la descarga falle.

Y podemos revisar el contenido iterando sobre walkdir() que recorre los elementos de un directorio.

itr = walkdir("../../data/")
(root, dirs, files) = first(itr)
("../../data/", String[], [".gitkeep", "titanic.csv", "titanic.json", "titanic.parquet"])

Disponemos de los comandos más usuales a la hora de crear un directorio (mkdir()) o adentrarnos en él (cd()). Tenéis más detalle sobre los comandos disponibles aquí.