0Pricing
Lua Academy · Lezione

Lettura del contenuto dei file

Legga righe, byte e contenuto completo con i metodi file:read().

Lettura del contenuto dei file è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Leggere un file intero

Usi f:read("a") (o "*a") per leggere l'intero file in una stringa. È una soluzione semplice e adatta ai file piccoli e medi. Per i file molto grandi, legga a blocchi o riga per riga per evitare problemi di 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

Leggere riga per riga

f:read("l") legge la riga successiva, rimuovendo il carattere di nuova riga. Restituisce nil alla fine del file. Usi while per elaborare ogni riga. f:lines() è la forma abbreviata idiomatica che svolge la stessa operazione.

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

Leggere un numero fisso di byte

Passi un numero a f:read(n) per leggere esattamente n byte. Restituisce una stringa contenente fino a n byte (meno se viene raggiunto EOF) oppure nil alla fine del file. È utile per i protocolli binari o i formati di file strutturati.

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

Leggere un numero

f:read("n") legge il numero successivo dal file, ignorando gli spazi vuoti. Restituisce un numero Lua oppure nil se il token successivo non è un numero. È utile per leggere file di dati numerici strutturati.

-- 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

Spostarsi all'interno dei file

f:seek(whence, offset) sposta la posizione nel file. whence può essere "set" (dall'inizio), "cur" (dalla posizione corrente) oppure "end" (dalla fine). Restituisce la nuova posizione assoluta. È utile per rileggere parti del file o spostarsi al suo interno.

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

Leggere file CSV

Analizzi i dati CSV riga per riga: legga ogni riga, quindi la separi in base alle virgole usando string.gmatch. Per un utilizzo in produzione, gestisca i campi racchiusi tra virgolette e le virgole interne alle virgolette; per dati semplici è sufficiente la suddivisione di base.

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"}}

Leggere file di configurazione

Per un semplice formato di configurazione chiave=valore, legga il file riga per riga, ignori i commenti e le righe vuote e analizzi le coppie chiave=valore 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)

Lettura a blocchi

Per i file grandi, legga blocchi di dimensione fissa per evitare di caricare tutto in memoria. Elabori ogni blocco man mano che viene letto. È essenziale per i file più grandi della RAM disponibile.

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

Leggere più valori per riga

Quando ogni riga contiene più valori separati da spazi o tabulazioni, usi string.match o string.gmatch per estrarli. Questo schema gestisce i semplici file di testo strutturati.

-- 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

Scorciatoia io.lines

io.lines(filename) apre il file, restituisce un iteratore di righe e chiude il file al termine. È il modo più conciso per leggere un file riga per riga senza gestire esplicitamente l'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)

Verifica rapida

Che cosa restituisce f:read("a") quando il puntatore del file si trova già alla fine del file?

Riepilogo: lettura dei file

Riepilogo:

  • f:read("a") — l'intero file come stringa
  • f:read("l") — una riga, senza carattere di nuova riga
  • f:read(n) — esattamente n byte
  • f:read("n") — il numero successivo
  • io.lines(path) — iteratore di righe, con chiusura automatica
  • f:seek() — spostamento a una posizione

Domande Frequenti

La lezione «Lettura del contenuto dei file» è gratuita?

Sì — il testo completo di «Lettura del contenuto dei file» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Lettura del contenuto dei file»?

Legga righe, byte e contenuto completo con i metodi file:read(). Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Lettura del contenuto dei file»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Apertura dei file con io.open
  2. Lettura del contenuto dei file
  3. Scrittura e aggiunta ai file
  4. Chiusura dei file e gestione degli errori
← Torna a Lua Academy