0Pricing
Lua Academy · Lección

Lectura del contenido de archivos

Lea líneas, bytes y el contenido completo con los métodos file:read().

Lectura del contenido de archivos es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

Leer el archivo completo

Use f:read("a") (o "*a") para leer el archivo completo en una cadena. Es una opción sencilla y adecuada para archivos pequeños o medianos. Para archivos muy grandes, lea en bloques o línea por línea para evitar problemas de memoria.

local f = io.open("config.txt", "r")
if f then
  local content = f:read("a")
  f:close()
  print("Size:", #content, "bytes")
  print(content)
end

Leer línea por línea

f:read("l") lee la siguiente línea y elimina el salto de línea. Devuelve nil al llegar a EOF. Use while para procesar cada línea. f:lines() es la forma abreviada idiomática de hacer lo mismo.

local f = io.open("data.txt", "r")
if f then
  local line = f:read("l")
  while line ~= nil do
    print(line)
    line = f:read("l")
  end
  f:close()
end

-- Equivalent with for loop:
-- for line in io.lines("data.txt") do print(line) end

Leer una cantidad fija de bytes

Pase un número a f:read(n) para leer exactamente n bytes. Devuelve una cadena de hasta n bytes (menos si se alcanza EOF) o nil al llegar a EOF. Úselo para protocolos binarios o formatos de archivo estructurados.

local f = io.open("binary.dat", "rb")
if f then
  -- Read 4-byte header
  local header = f:read(4)
  if header then
    print("Header bytes:", #header)
    for i = 1, #header do
      io.write(string.format("%02X ", header:byte(i)))
    end
    print()
  end
  f:close()
end

Leer un número

f:read("n") lee el siguiente número del archivo e ignora los espacios en blanco. Devuelve un número de Lua o nil si el siguiente token no es un número. Es útil para leer archivos de datos numéricos estructurados.

-- File contains: "10 20 30.5 40"
local f = io.open("nums.txt", "r")
if f then
  local total = 0
  local n = f:read("n")
  while n do
    total = total + n
    n = f:read("n")
  end
  f:close()
  print("Sum:", total)
end

Desplazarse dentro de archivos

f:seek(whence, offset) mueve la posición del archivo. whence puede ser "set" (desde el principio), "cur" (desde la posición actual) o "end" (desde el final). Devuelve la nueva posición absoluta. Úselo para volver a leer partes del archivo o saltar a distintas posiciones.

local f = io.open("test.txt", "r")
if f then
  -- Jump to end, get file size
  local size = f:seek("end")
  print("File size:", size, "bytes")
  
  -- Seek back to start
  f:seek("set", 0)
  local first_line = f:read("l")
  print("First line:", first_line)
  f:close()
end

Leer archivos CSV

Analice los datos CSV línea por línea: lea cada línea y, después, sepárela por comas mediante string.gmatch. En código de producción, gestione los campos entre comillas y las comas que aparecen dentro de ellas; para datos sencillos, basta con la separación básica.

local function parseCSV(path)
  local rows = {}
  for line in io.lines(path) do
    local row = {}
    for field in string.gmatch(line, "([^,]+)") do
      row[#row+1] = field
    end
    rows[#rows+1] = row
  end
  return rows
end

-- Example: "Alice,30,Engineer"
-- => {{"Alice","30","Engineer"}}

Leer archivos de configuración

Un formato de configuración sencillo basado en clave=valor: lea línea por línea, omita los comentarios y las líneas en blanco, y analice los pares clave=valor con string.match.

local function loadConfig(path)
  local cfg = {}
  for line in io.lines(path) do
    -- Skip comments and blank lines
    if not line:match("^%s*#") and line:match("%S") then
      local k, v = line:match("^%s*(%w+)%s*=%s*(.-)%s*$")
      if k then cfg[k] = v end
    end
  end
  return cfg
end

local config = loadConfig("app.conf")
print(config.host, config.port)

Lectura por bloques

Para archivos grandes, lea bloques de tamaño fijo para evitar cargar todo en memoria. Procese cada bloque a medida que llegue. Esto es fundamental para archivos cuyo tamaño supera la RAM disponible.

local function processLarge(path, chunkSize)
  chunkSize = chunkSize or 4096
  local f, err = io.open(path, "rb")
  if not f then return nil, err end
  local totalBytes = 0
  local chunk = f:read(chunkSize)
  while chunk do
    totalBytes = totalBytes + #chunk
    -- process chunk here
    chunk = f:read(chunkSize)
  end
  f:close()
  return totalBytes
end

Leer varios valores por línea

Cuando cada línea contiene varios valores separados por espacios o tabulaciones, use string.match o string.gmatch para extraerlos. Este patrón permite procesar archivos de texto estructurados sencillos.

-- File: "Alice 95 A\nBob 87 B"
local results = {}
for line in io.lines("grades.txt") do
  local name, score, grade = line:match("(%S+)%s+(%d+)%s+(%S+)")
  if name then
    results[#results+1] = {
      name=name,
      score=tonumber(score),
      grade=grade
    }
  end
end

for _, r in ipairs(results) do
  print(r.name, r.score, r.grade)
end

Atajo io.lines

io.lines(filename) abre el archivo, devuelve un iterador de líneas y cierra el archivo al terminar. Es la forma más concisa de leer un archivo línea por línea sin administrar explícitamente el handle.

-- Count non-empty lines
local count = 0
for line in io.lines("data.txt") do
  if line:match("%S") then
    count = count + 1
  end
end
print("Non-empty lines:", count)

-- Collect all lines into a table
local lines = {}
for line in io.lines("data.txt") do
  lines[#lines+1] = line
end
print("Total lines:", #lines)

Comprobación rápida

¿Qué devuelve f:read("a") cuando el puntero del archivo ya está en EOF?

Resumen: leer archivos

Resumen:

  • f:read("a") — archivo completo como cadena
  • f:read("l") — una línea, sin salto de línea
  • f:read(n) — exactamente n bytes
  • f:read("n") — siguiente número
  • io.lines(path) — iterador de líneas que cierra automáticamente el archivo
  • f:seek() — saltar a una posición

Preguntas frecuentes

¿La lección «Lectura del contenido de archivos» es gratis?

Sí — el texto completo de «Lectura del contenido de archivos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Lectura del contenido de archivos»?

Lea líneas, bytes y el contenido completo con los métodos file:read(). Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Lectura del contenido de archivos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Apertura de archivos con io.open
  2. Lectura del contenido de archivos
  3. Escritura y adición en archivos
  4. Cierre de archivos y gestión de errores
← Volver a Lua Academy